标签:
要想让进程同时执行多个函数,可以使用线程或从原程序中创建一个完全分离的进程,后者就像init的做法一样,而不像exec调用那样用新程序替换当前执行的线程。
可以通过调用fork创建一个新进程,这个系统调用复制当前进程,在进程表中创建一个新的表项,新表项中的许多属性与当前进程是相同的。新进程几乎与原进程一模一样,执行的代码与完全相同,但新进程有自己的数据空间、环境和文件描述符。fork和exec函数结合在一起使用就是创建新进程所需要的一切了。
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
最初的进程---->fork()----->新进程(返回0)
|
-------->原进程继续执行(返回一个新的PID)
在父进程中的fork调用返回的是新的子进程的PID,新进程将继续执行,就像原进程一样,不同之处在于,子进程中的fork调用返回的是0。父子进程可以通过这一点来判断究竟谁是父进程,谁是子进程。
如果fork失败,它将返回-1.失败通常是因为父进程所拥有的子进程数目超过了规定的限制(CHILD_MAX),此时errno将被设为EAGAIN。如果是因为进程表里没有足够的空间用于创建新的表单或虚拟内存不足,errno变量将被设为ENOMEN。
一个典型的使用fork的代码片段如下所示:
pid_t new_pid;
new_pid = fork();
switch(new_pid){
case -1: /* Error */
break;
case 0: /* We are child */
break;
default: /* We are parent */
break;
}
编写程序fork1.c
这个程序以两个进程的方式在运行。子进程被创建并且输出消息5次。原进程(即父进程)只输出消息3次。父进程在子进程打印完它的全部消息之前就结束了,因此可以看到在输出内容中混杂着一个shell提示符。
程序在调用fork时被分为两个独立的进程。程序通过fork调用返回的非零值确定父进程,并根据该值来设置消息的输出次数,两次消息的输出之间间隔一秒。
当用fork启动一个子进程时,子进程就有了它自己的声明周期并将独立运行。有时,希望知道一个子进程何时结束。例如,在前面的示例程序中,父进程在子进程之前结束,由于子进程还在继续运行,所以得到的输出结果有点乱。可以通过在父进程中调用wait函数让父进程等待子进程的结束。
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *stat_loc);
wait系统调用将暂停父进程直到它的子进程结束为止。这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态,即子进程的main函数返回的值或子进程中exit函数的退出码。如果stat_loc不是空指针,状态信息将被写入它所指向的位置。
可以用sys/wait.h文件中定义的宏来解释状态信息。如下所示:
宏 说明
WIFEXITED(stat_val) 如果子进程正常结束,它就去一个非零值
WEXITSTATUS(stat_val) 如果WIFEXITED非零,它返回子进程的退出码
WIFSIGNALED(stat_val) 如果子进程因为一个未捕获的信号而终止,它就取一个非零值
WTERMSIG(stat_val) 如果WIFSIGNALED非零,它返回一个信号代码
WIFSTOPPED(stat_val) 如果子进程意外终止,它就取一个非零值
WSTOPSIG(stat_val) 如果WIFSTOPPED非零,它就返回一个信号代码
编写wait.c
wait.c函数比fork1.c函数多出如下代码:
if (pid != 0){
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("Child has finished: PID = %d\n", child_pid);
if (WIFEXITED(stat_val))
printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
else
printf("Child terminated abnormally\n");
}
父进程(从fork调用中获得一个非零的返回值)用wait系统调用将自己的执行挂起,直到子进程的状态信息出现为止。这将发生在子进程调用exit的时候。将子进程的退出码设置为37。父进程然后继续运行,通过测试wait调用的返回值来判断子进程是否正常终止。如果是,这就从状态信息中提取出子进程的退出码。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/46714985