我试图测试如何创建和管理进程与程序什么应该创建一个进程和执行一个命令2次(每次执行不同的命令)。
我想做的就是:
- 创建新PID
- 打印PID
- 执行命令
- 退出
奇怪的是,当我执行一个命令时,它工作正常,但是当我执行两次例程时,第二个命令也被执行了两次。这意味着执行了3个命令。
下面是我的代码:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
void launch_command(char command[]) {
pid_t pid;
pid = fork();
if(pid==0)
{
printf("Creating process %d from %d\n", getpid(),getppid());
system(command);
exit(0);
}
else {
if ((pid = fork()) == -1)
perror("Error while creating a new process");
}
}
int main () {
printf("Root process: %d\n",getpid());
launch_command("/bin/ls -l");
while(wait(NULL) >= 0);
launch_command("/bin/date");
while(wait(NULL) >= 0);
return 0;
}
输出:
$ ./a.out
Root process: 8924
Creating process 8925 from 8924
Creating process 8928 from 8926
Sun 13 Nov 2022 23:54:51 EST
total 128
-rwxr-xr-x 1 gg staff 49784 13 Nov 23:54 a.out
-rw-r--r-- 1 gg staff 3499 11 Nov 10:59 create_process.c
Creating process 8931 from 8924
Sun 13 Nov 2022 23:54:51 EST
有人能解释一下我的这种行为吗?
所需结果应为:
$ ./a.out
Root process: 8924
Creating process 8925 from 8924
total 128
-rwxr-xr-x 1 gg staff 49784 13 Nov 23:54 a.out
-rw-r--r-- 1 gg staff 3499 11 Nov 10:59 create_process.c
Creating process 8931 from 8924
Sun 13 Nov 2022 23:54:51 EST
1条答案
按热度按时间ztigrdn81#
正如注解中指出的,对
fork
的第二次调用创建了太多的进程。在第一次调用
launch_command
返回后,会有一个父进程和一个新创建的子进程,它们都将调用第二个launch_command
函数,产生另外两个调用system
的进程,然后每个进程都产生一个额外的进程,这些进程也会从函数返回。总共将有四个进程执行第二个
while
循环。删除第二个
fork
调用,并再次使用相同的pid
值来检查故障。