6)vfork以及execl的使用 a.修改你编写的代码,统计创建的子进程的数量,并在主进程
时间: 2023-10-19 15:03:17 浏览: 103
vfork是一个系统调用,用于创建一个新的进程,该进程是当前进程的一个副本。与fork不同的是,vfork创建的子进程会共享父进程的地址空间,直到它调用exec或者_exit之后才会创建新的地址空间。这意味着在子进程中对地址空间的修改会影响到父进程。
而execl是一个系统调用,用于在当前进程中执行一个新的程序。
下面是示范代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
int count = 0; // 用于计数的变量
for (int i = 0; i < 3; i++) {
pid_t pid = vfork();
if (pid == -1) {
perror("vfork() error");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程
execl("/bin/ls", "ls", NULL);
perror("execl() error"); // execl失败时会执行到这里
exit(EXIT_FAILURE);
} else {
// 父进程
count++; // 子进程数量加一
printf("创建子进程: %d\n", count);
}
}
// 等待所有子进程结束
for (int i = 0; i < count; i++) {
wait(NULL);
}
return 0;
}
```
以上代码创建了三个子进程,并且在子进程中调用了ls程序。在父进程中,使用count变量来统计创建的子进程数量,并打印出每次创建子进程的序号。
注意:由于vfork创建的子进程共享父进程的地址空间,所以在子进程中调用execl后无需再调用_exit或exit来退出子进程。
阅读全文