LINUX C系统编程学习笔记-----------进程编程

进程编程

一.获取ID:

     #include <sys/types.h>

#include <unistd.h>

pid_t getpid(void);

获取本进程ID

pid_t getppid(void);

获取父进程ID

例: 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
    printf("PID = %d\n",getpid());
    printf("PPID = %d\n",getppid());
    return 0;

二.进程创建

#include <unistd.h>

   pid_t fork(void);

创建子进程

fork被调用一次返回两次,他可能有三种不同的返回值:

1.在父进程中fork返回新创建的子进程的PID。

2.在子进程中,fork返回0.

3. 如果出现错误,fork返回一个负值

例: 

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    pid_t pid;
    pid = fork();
    if (pid < 0)
    {
        printf("error in fork!\n");
    }
    else if (pid == 0)
    {
        printf("I am the child process,ID is %s\n",getpid());
    }    
    else 
    {
        printf("I am the parent process,ID is %d\n",getpid());
    }
    return 0;

考虑以下代码的运行结果:

 

#include <unistd.h>
#include <stdio.h>

int main(void)
{
    pid_t pid;
    int count = 0;
    pid = fork();
    count++;
    printf("count = %d\n",count);
    return 0;


它会打印两次count,但是两次值都是1.现在能看出使用fork的情况了吧。

 

  pid_t vfork(void);

创建子进程 

 

区别:

1·vfork:子进程与父进程共享数据段。

    fork: 子进程拷贝父进程的数据段。

2·fork: 父,子进程的执行次序不确定。

  vfork: 子进程先运行,父进程在运行

 

  现在把上面的思考中的fork换成vfork后,在想想会是什么结果。

 

三.exec函数族 

exec用被执行的程序替换调用它的程序 

区别:

fork创建一个新的进程,产生一个新的PID。

exec启动一个新的程序,替换原有的进程,PID不变。(好像这个做坏事的时候可以用,(*^__^*) 嘻嘻……)

1. #include <unistd.h> 

int execl (const char *path,const char *arg1,········,argn);

path:被执行的程序名(包含完整路径)

arg1-argn:被执行程序所需要的命令,含参数含程序名,以空指针(NULL)结束 。

例:

#include <unistd.h>

int main(void)
{
    execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
    return 0;


2.

int execlp(const char *path,const char *arg1.······argn);

path:被执行的程序名(不包含路径,将从Path环境变量中直接找该程序)

arg1-argn:被执行的程序所需的命令行参数,含程序名,以空指针(NULL)结束

例:

#include <unistd.h>

int main(void)
{
    execlp("ls","ls","-al","/etc/passwd",(char*)0);
    return 0;


3.

int execv(const char *path,char * const argv[]);

path:被执行的程序名(含完整路径)

argv[]:被执行程序所需要的命令行参数数组

例:

#include <unistd.h>

int main(void)
{
    char *argv[]={"ls","-al","/etc/passwd",(char*)0};
    execv("/bin/ls",argv);
    return 0;


4.

int system(const char * string);

调用fork产生一个子进程,由子进程来调用/bin/ls来执行参数,string代表的命令。

例:

#include <stdlib.h>

int main(void)
{
    system("ls -al /etc/passwd");
    return 0;


 四.进程等待

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status);

阻塞该进程,直到某个子进程退出。

 

例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    pid_t pc,pr;
    pc = fork();
    if (pc == 0) //如果是子进程
    {
        printf("This is child process with pid of %d\n",getpid());
        sleep(10); //睡眠10秒
    }
    else if (pc > 0) //如果是父进程
    {
        pr = wait(NULL);//等待
        printf("I catched a child process with pid of %d\n",pr);
    }
    exit(0);
    return 0;


 

posted @ 2012-06-26 10:51  xss  阅读(503)  评论(0编辑  收藏  举报