#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> /************************ * 返回值: 调用成功且子进程正常退出返回退出代码,否则返回-1 *************************/ int waitProcess() { int status = -1; /********** BEGIN **********/ /********** END **********/ return status; }
时间: 2023-07-18 21:48:00 浏览: 83
这段代码看起来像是一个函数,名为 waitProcess,其目的是等待子进程的结束并获取其退出状态码。其中包含了一些头文件和变量声明,但是函数体中缺少具体实现。在函数体中应该使用 waitpid 函数来等待子进程结束并获取其退出状态码。以下是可能的实现方式:
```
int waitProcess() {
int status = -1;
pid_t child_pid;
child_pid = waitpid(-1, &status, 0);
if (child_pid < 0) {
perror("waitpid");
return -1;
}
return status;
}
```
在这个实现中,我们使用了 waitpid 函数来等待任意子进程结束并获取其退出状态码。函数的第一个参数 -1 表示等待任意子进程,第二个参数 &status 是一个输出参数,用来存储子进程的退出状态码,第三个参数 0 表示等待状态改变的任何子进程,并阻塞调用进程。如果 waitpid 调用失败,函数会返回 -1。否则,函数会返回子进程的退出状态码。
相关问题
画出下段代码的进程家族数#include <unistd.h> #include <sys/types.h> #include<sys/wait.h>#include <stdio.h> #include <stdlib.h> main () { int status;int pid1,pid2,pid3; pid1=fork();if (pid1< 0) { printf("error in fork pid1!"); exit(0); } else if (pid1 == 0) printf("pid1=0, my process id is %d\n",getpid()); else if (pid1 > 0) { pid2=fork( );if (pid2< 0) { printf("error in fork pid2!"); exit(0); }else if (pid2 == 0)printf("pid2=0, my process id is %d\n",getpid()); else if (pid2 > 0) printf(" pid2>0, my process id is %d\n",getpid()); } pid3=fork();if (pid3< 0) { printf("error in fork pid3!"); exit(0); } else if (pid3 == 0) printf("pid3=0, my process id is %d\n",getpid()); else if (pid3 > 0) printf("pid3>0, my process id is %d\n",getpid());wait(&status);exit(0); }
根据给出的代码,我们可以画出以下的进程家族树:
```
(main)
/ | \
pid1(子) | pid3(子)
/ | \
pid2(孙) pid2(孙) pid2(孙)
```
进程家族树的解释:
- 根节点为主进程 `main`,即初始进程。
- `main` 进程创建了子进程 `pid1`。
- `pid1` 进程创建了孙进程 `pid2`。
- `pid1` 进程还创建了子进程 `pid3`。
- `pid3` 进程也创建了孙进程 `pid2`。
- `main` 进程等待所有子进程结束后才退出,因此最后只有一个 `wait()` 系统调用,没有 `waitpid()` 系统调用,因此 `main` 进程会等待子进程和孙进程全部结束后才退出。
分析此段代码给出结果并画出进程家族树#include <unistd.h> #include <sys/types.h> #include<sys/wait.h>#include <stdio.h> #include <stdlib.h> main () { int status;int pid1,pid2,pid3; pid1=fork();if (pid1< 0) { printf("error in fork pid1!"); exit(0); } else if (pid1 == 0) printf("pid1=0, my process id is %d\n",getpid()); else if (pid1 > 0) { pid2=fork( );if (pid2< 0) { printf("error in fork pid2!"); exit(0); }else if (pid2 == 0)printf("pid2=0, my process id is %d\n",getpid()); else if (pid2 > 0) printf(" pid2>0, my process id is %d\n",getpid()); } pid3=fork();if (pid3< 0) { printf("error in fork pid3!"); exit(0); } else if (pid3 == 0) printf("pid3=0, my process id is %d\n",getpid()); else if (pid3 > 0) printf("pid3>0, my process id is %d\n",getpid());wait(&status);exit(0); }
这段代码会创建三个子进程,进程间的关系如下图所示:
```
main process
|
pid1 fork
/ \
pid2 fork pid3 fork
/ \ / \
/ \ / \
pid2 pid2 pid3 pid3
child parent child parent
```
具体的执行过程如下:
1. 首先主进程创建了子进程 pid1。
2. 如果 pid1 小于 0,说明创建子进程失败,打印错误信息并退出程序。
3. 如果 pid1 等于 0,说明当前进程是 pid1 的子进程,打印 pid1=0 和当前进程的 ID。
4. 如果 pid1 大于 0,说明当前进程是主进程,继续创建子进程 pid2。
5. 如果 pid2 小于 0,说明创建子进程失败,打印错误信息并退出程序。
6. 如果 pid2 等于 0,说明当前进程是 pid2 的子进程,打印 pid2=0 和当前进程的 ID。
7. 如果 pid2 大于 0,说明当前进程是主进程,打印 pid2>0 和当前进程的 ID。
8. 主进程继续创建子进程 pid3。
9. 如果 pid3 小于 0,说明创建子进程失败,打印错误信息并退出程序。
10. 如果 pid3 等于 0,说明当前进程是 pid3 的子进程,打印 pid3=0 和当前进程的 ID。
11. 如果 pid3 大于 0,说明当前进程是主进程,打印 pid3>0 和当前进程的 ID。
12. 最后,主进程调用 wait() 等待子进程结束,退出程序。
注意,由于进程的创建和执行是异步的,所以进程的输出顺序可能与上述描述的顺序不完全一致。
阅读全文