要想让进程同时执行多个函数,我们可以使用线程或从源程序中创建一个完全分离的进程,后者就像init的做法一样,而不像exec调用那样用新程序替换当前指向的线程。
我们可以通过调用fork创建一个新进程。这个系统调用复制当前进程,在进程表中创建一个新的表项,新表项中许多属性和当前进程是相同的。
新进程几乎和原进程一模一样,执行的代码也全部一样,但新进程有自己的数据空间,环境和文件描述符。
fork和exec函数结合使用就是创建新进程所需要的一切了。
#include<sys/type.h>
#include<unistd.h>
pid_t fork(void);
在父进程中调用返回的是新的子进程的PID。新进程进继续执行,不过子进程中fork返回的是0.父子进程可以通过这一点来判断谁是父子。
如果fork失败返回-1,通常是因为父进程所拥有的子进程数目超过规定限制。
fork1.c
#include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> int main() { pid_t pid; char *message; int n; printf("fork program starting!\n"); pid = fork(); switch(pid) { case -1: perror("fork failed!"); exit(1); case 0: message = "this is child"; n = 5; break; default : message = "this is parenet"; n = 2; break; } for(;n>0;n--) { puts(message); sleep(1); } exit(0); }
当用fork启动一个子进程时,紫禁城就有了自己的生命周期并将独立运行。我们可以通过在父进程中调用wait函数让父进程等待子进程的结束。
#include<sys/types.h>
#inlcude<sys/wait.h>
pid_t wait(int *stat_loc);
wait系统调用将暂停父进程知道他的子进程结束为止。这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态,及
子进程main函数的返回值或子进程中exit函数的退出码。如果stat_loc不是空指针,状态信息将被写入它所指向的位置。
我们可以通过sys/wait.h文件中定义的宏来解释状态信息。
wait.c
#include<sys/types.h> #include<sys/wait.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> int main() { pid_t pid; char *message; int n; int exit_code; printf("fork program starting!\n"); pid = fork(); if (pid < 0) { printf("this is fork error!\n"); exit(1); }else if(pid == 0) { printf("this is child!\n"); message = "child"; n = 5; exit_code = 37; }else { printf("this is parent!\n"); n = 3; message = "parent"; exit_code = 0; } for(;n>0;n--) { puts(message); sleep(1); }
//程序这一部分等待子进程完成。 if (pid != 0) { int stat_val; pid_t child_pid; child_pid = wait(&stat_val); printf("child has finished:pid=%d\n",child_pid); printf("this stat_val is :%d\n",stat_val);
//如果子进程正常结束,它就取一个非零值
if(WIFEXITED(stat_val)) { //如果WIFEXITED非零,则返回子进程的退出码
printf("child exited with code %d\n",WEXITSTATUS(stat_val)); }
else { printf("child terminated abnormally\n"); } } exit(exit_code); }
原文:http://www.cnblogs.com/xiaodeyao/p/6390786.html