父进程创建子进程,子进程在暂停8s之后退出,父进程用非阻塞,用fork函数创建两个子进程,子进程1,运行(调用execlp()执行“ls-1”的命令,子进程2运行(调用sleep函数)。 父进程,阻塞式等待进程1的结束,然后判断进程二是否结束,如未结束,等待1秒,阻塞式等待进程1的结束,(循环)如收集到进程结束的信息,父进程就返回。 Linux系统中用C语言代码
时间: 2024-03-16 17:42:28 浏览: 73
代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t child1, child2;
int status;
// 创建子进程1
child1 = fork();
if (child1 == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
else if (child1 == 0) {
// 子进程1运行命令 “ls -1”
execlp("ls", "ls", "-1", NULL);
perror("execlp");
exit(EXIT_FAILURE);
}
// 创建子进程2
child2 = fork();
if (child2 == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
else if (child2 == 0) {
// 子进程2暂停8秒
sleep(8);
exit(EXIT_SUCCESS);
}
// 阻塞式等待子进程1结束
waitpid(child1, &status, 0);
if (WIFEXITED(status)) {
printf("子进程1结束,退出状态为 %d\n", WEXITSTATUS(status));
}
// 判断子进程2是否结束
while (1) {
if (waitpid(child2, &status, WNOHANG) == child2) {
if (WIFEXITED(status)) {
printf("子进程2结束,退出状态为 %d\n", WEXITSTATUS(status));
}
break;
}
else {
printf("等待子进程2结束...\n");
sleep(1);
}
}
return 0;
}
```
在该代码中,我们使用了 `fork()` 函数创建了两个子进程,子进程1运行 `execlp()` 函数执行 `ls -1` 命令,子进程2暂停8秒后退出。在父进程中,我们使用 `waitpid()` 函数阻塞式等待子进程1结束,并判断子进程2是否结束,如果未结束则等待1秒后再次判断,直到收集到子进程2结束的信息,然后父进程返回。
阅读全文