学习fork()的心得
一、系统调用错误处理
例:
二、进程控制
1.获取进程id
每个进程都有唯一的正数(非零)进程ID(PID)。
如上图,getpid函数返回调用进程的PID。getppid函数返回它的父进程的PID(创建调用进程的进程)
2.创建和终止进程
#include <stdlib.h>
void exit(int status);
exit函数以status退出状态来终止进程(另一种设置退出状态的方法是从主程序中返回一个整数值)
3.示例及注释
int main()
{
pid_t pid;
int x = 1;
pid = Fork();
if(pid == 0){
/*child*/
printf("child : x=%d\n",++x);
exit(0);/*若没有exit(0)子进程也要输出下面的代码*/
}
/*Parent*/
printf("parent : x=%d\n",--x);
exit(0);
}
上述示例需要注意的地方
-
调用一次,返回两次。fork函数被父进程调用了一次,却返回两次——一次是返回到父进程,一次是返回到新创建的子进程。
-
并发执行。父进程和子进程是并发运行的。他们都是独立的个体,无法推测谁先进行。
三、forks10-15函数解析
#define N 5
/*
* fork10 - Synchronizing with multiple children (wait)与多个进程同步(等待)
* Reaps children in arbitrary order按任意顺序回收孩子进程
* WIFEXITED and WEXITSTATUS to get info about terminated children获取已终止的子进程的信息
*/
void fork10()
{
pid_t pid[N];
int i, child_status;
for (i = 0; i < N; i++)
if ((pid[i] = fork()) == 0) {
exit(100+i); /* Child */
}
for (i = 0; i < N; i++) {
/* Parent */
pid_t wpid = wait(&child_status);
if (WIFEXITED(child_status))//如果子程序通过调用exit或return正常终止
printf("Child %d terminated with exit status %d\n"