以下代码为网上的一段代码,注释是我自己加的,正确与否,若有异议,坑请赐教
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
void die(const char *msg) //创建失败,则打印错误信息
{
perror(msg);
exit(1); //exit(0)代表正常退出,exit(1)代表错误退出
}
void child2_do()
{
printf("In child2: execute 'date'\n");
sleep(5); //睡眠5秒,让其他进程执行
if (execlp("date", "date", NULL) < 0) //终端执行date,打印时间信息
{
perror("child2 execlp");
}
}
void child1_do(pid_t child2, char *argv)
{
pid_t pw;
do {
if (*argv == '1')
{
pw = waitpid(child2, NULL, 0);
}
else
{
pw = waitpid(child2, NULL, WNOHANG); //如果子进程2没有终止,则立即返回
}
if (pw == 0) //pw等于0时说明进程2没有退出,pw不等于0时,说明进程2已经退出
{
printf("In child1 process:\nThe child2 process has not exited!\n");
sleep(1);
}
}while (pw == 0);
if (pw == child2) //进程2正常退出时,则在终端显示进程2的pid,并执行pwd
{
printf("Get child2 %d.\n", pw);
sleep(5);
if (execlp("pwd", "pwd", NULL) < 0) {
perror("child1 execlp");
}
}
else {
printf("error occured!\n");
}
}
void father_do(pid_t child1, char *argv)
{
pid_t pw;
do {
if (*argv == '1') {
pw = waitpid(child1, NULL, 0);
}
else {
pw = waitpid(child1, NULL, WNOHANG);
}
if (pw == 0) {
printf("In father process:\nThe child1 process has not exited.\n");
sleep(1);
}
}while (pw == 0);
if (pw == child1) {
printf("Get child1 %d.\n", pw);
if (execlp("ls", "ls", "-l", NULL) < 0) {
perror("father execlp");
}
}
else {
printf("error occured!\n");
}
}
int main(int argc, char *argv[])
{
pid_t child1, child2;
if (argc < 3) //如果输入的参数少于3个,则打印如下信息
{
printf("Usage: waitpid [0 1] [0 1]\n");
exit(1);
}
child1 = fork(); //创建子进程1
if (child1 < 0) {
die("child1 fork");
}
else if (child1 == 0)
{
child2 = fork(); //在子进程child1中再次创建一个子进程child2
if (child2 < 0) {
die("child2 fork");
}
else if (child2 == 0)
{
child2_do(); //检验如果创建的child2的pid==0,则执行child2_do();
}
else //检验如果创建的child2的pid!=0,则执行child1_do();
{
child1_do(child2, argv[1]); //注意:输入参数为进程2的pid,argv[1]
}
}
else //如果是父进程,则执行father_do
{
father_do(child1, argv[2]);
}
return 0;
}
终端上执行的结果明天在给出,现在太晚了,要睡了