进程
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; }
|