进程
Linux下C语言进程相关的函数主要有:
| 函数 | 
说明 | 
| getpid() | 
获取当前进程ID | 
| getppid() | 
获取父进程ID | 
| getpgrp() | 
获取进程组ID | 
| fork() | 
创建子进程 | 
| wait() | 
等待子进程结束 | 
fork()函数是Linux系统下C语言用来创建子进程的函数。最简单的用法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | #include <stdio.h> #include <unistd.h>
  int main(void){     pid_t pid;
      pid=fork();     printf("%d->%d\n",getpid(),pid);      }
 
 
 
 
 
 
   | 
 
可以看到,fork()函数后的printf函数,执行了两次,一次是在进程ID为14920的进程中,打印pid的值为14930。另一次是在进程ID为14930的进程中,打印了0。
这就是fork()函数的用法,它会在程序中返回两次,在父进程中的返回值是子进程的进程ID,子进程中返回0,如此便可区分父、子进程。可以利用这个原理设计一个双进程的程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
   | #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h>
  int glob = 1;
  int main(void){     int var = 2;          pid_t pid;
      printf("ProcessID(%d) ParentProcessID(%d)\n", getpid(),getppid());     printf("&var: %x\t&glob: %x\tvar(%d)\tglob(%d)\n", &var,&glob, glob, var);              if ((pid = fork()) < 0) {                  printf("Fock Error");     } else if (pid == 0) {                  printf("\n");         printf("ProcessID(%d) ParentProcessID(%d)\n", getpid(),getppid());         sleep(2);         glob++;         var++;         printf("ProcessID(%d) ParentProcessID(%d)\n", getpid(),getppid());         printf("&var: %x\t&glob: %x\tvar(%d)\tglob(%d)\n", &var,&glob, glob, var);         printf("\n");     } else {                  sleep(1);                  printf("&var: %x\t&glob: %x\tvar(%d)\tglob(%d)\n", &var,&glob, glob, var);     }      }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   | 
 
在此例中,程序是以双进程的方式在系统中执行的。并且父进程比子进程执行时间短,所以父进程先结束,子进程在父进程退出后,仍然在控制台打印出信息,是因为在父进程退出后,子进程会交由系统接管,此时子进程的父进程ID变成了一个系统进程(systemd或者init)。
多进程
C语言多进程Fork实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
   | #include <stdio.h> #include <unistd.h> #include <sys/wait.h>
  int main(void){     int i=0;     for(i=0;i<3;i++){         pid_t fpid = fork();         if(fpid==0)             printf("\tSon: %d (%d)\n",getpid(),getppid());         else             wait(0);             printf("Father: %d (%d)\n",getpid(),getppid());     }     return 0; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   | 
 
一个完整的多进程示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
   | #include <stdio.h> #include <unistd.h> #include <sys/wait.h>
  int sub_func(int sec){     printf("\tProcess:%d, ParentProcess(%d), sec(%d)\n",getpid(),getppid(),sec);     sleep(sec);     return 0; }
  int main(void){     int i=0;     printf("Father: %d (%d)\n",getpid(),getppid());          for(i=0;i<3;i++){         pid_t fpid = fork();         if(fpid==0){             sub_func(i);         }else{             wait(&fpid);         }     }     return 0; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   |