循序渐进学unix——上机记录(二)
这次的主角是fork。相信每个unix的学习者都绕不过这个函数。此函数创建一个子进程,与父进程共享代码区,但是有自己单独的数据区和栈区。此函数在父进程中返回子进程的pid,而在子进程中却返回0。这恐怕是最让初学者们难以理解的地方了。正是因为这个性质,fork在使用是总是出现在if else块中;以区分父进程和子进程需要执行的代码。
1,小试牛刀,在使用fork的前后打印出当前进程的pid(getpid)和ppid(getppid)。结果很容易发现子进程中的ppid即为父进程的pid
#include<unistd.h>#include<stdio.h>#include<sys/stat.h>#include<sys/types.h>#include <stdlib.h>int main( int argc, char ** argv ){int val_fork1, val_fork2, val_fork3;int i, res_fils1, res_fils2, res_fils3, res;int a = atoi(argv[1]);int b = atoi(argv[2]);int c = atoi(argv[3]);int d = atoi(argv[4]);int e = atoi(argv[5]);int f = atoi(argv[6]);if( (val_fork1=fork())==0){res = a+b;printf("Fils 1 : a + b = %d\n", res);return(res);}else {if( (val_fork2=fork())==0){res = c+d;printf("Fils 2 : c + d = %d\n", res);exit(res);}if( (val_fork3=fork())==0){res = e+f;printf("Fils 3 : e + f = %d\n", res);exit(res);}waitpid(val_fork1, &res_fils1, 0);waitpid(val_fork2, &res_fils2, 0);waitpid(val_fork3, &res_fils3, 0);//printf("%d, %d, %d\n\n", WEXITSTATUS(res_fils1) , res_fils2 , res_fils3);printf("Résultat final = %d\n", WEXITSTATUS(res_fils1) *WEXITSTATUS(res_fils2) / WEXITSTATUS(res_fils3));return;}}
先到这,有时间继续!