fork() - 让 parent 进程工作而不等待 child 进程
fork() - have parent process do work without waiting for child process
我正在用 C 语言为一个学校项目制作一个 shell,如果命令这样做,它能够 运行 并行处理。
这是等待命令的shell应用程序的循环:
while (1) {
action = parseShellArgs();
if (action == 1) {
printf("Exiting...\n");
break;
} else if (action == 0) {
int pid = fork();
if (pid < 0) {
printf("Failed to fork\n");
} else if (pid == 0) {
(*NUM_PROCESSES_RUNNING)++;
printf("There are %d processes running\n", *NUM_PROCESSES_RUNNING);
char * solverArgs[] = {"a", shellArgs[1], NULL}; // first element is placeholder for argv[0]
execv("CircuitRouter-SeqSolver", solverArgs);
exit(0);
} else if (pid > 0) {
if (*NUM_PROCESSES_RUNNING >= MAXCHILDREN) {
printf("All processes are busy\n");
continue;
}
int status, childpid;
wait(&status);
childpid = WEXITSTATUS(status);
(*NUM_PROCESSES_RUNNING)--;
printf("There are %d processes running\n", *NUM_PROCESSES_RUNNING);
(void)childpid; // suppress "unused variable" warning
} else {
printf("Wait what\n");
}
} else {
printf("Oops, bad input\n");
}
}
请忽略常量的递增和递减。
现在,这只能部分起作用。每当我给它一个命令来创建另一个进程和 运行 另一个程序(条件操作 == 0,这已经过测试并且可以工作)时,就会发生分叉并且程序被正确执行。
但是,我不能多次分叉。我的意思是:程序分叉并且 child 按照 execv 调用中的指示执行。问题是 parent 进程没有返回到期望输入可能再次分叉,而是等待 child 进程完成。
我试图让这个循环做的是让 parent 始终期待输入并按照命令分叉,必要时有多个 children。但正如我上面解释的那样,parent 得到 "stuck" 等待单个 child 完成,然后才恢复 activity.
提前致谢。
编辑:我试验了多种组合,包括不等待 child 进程、使用额外的 fork 来期待输入等。
来自man wait.2
The wait() system call suspends execution of the calling process until
one of its children terminates.
您的程序卡住了,因为那是 wait
所做的。使用 waitpid
代替 WNOHANG
.
waitpid(pid_child, &status, WNOHANG);
不暂停调用进程的执行。您可以阅读 waitpid man page 以找出 return 值以及如何知道 child 是否终止。
我正在用 C 语言为一个学校项目制作一个 shell,如果命令这样做,它能够 运行 并行处理。
这是等待命令的shell应用程序的循环:
while (1) {
action = parseShellArgs();
if (action == 1) {
printf("Exiting...\n");
break;
} else if (action == 0) {
int pid = fork();
if (pid < 0) {
printf("Failed to fork\n");
} else if (pid == 0) {
(*NUM_PROCESSES_RUNNING)++;
printf("There are %d processes running\n", *NUM_PROCESSES_RUNNING);
char * solverArgs[] = {"a", shellArgs[1], NULL}; // first element is placeholder for argv[0]
execv("CircuitRouter-SeqSolver", solverArgs);
exit(0);
} else if (pid > 0) {
if (*NUM_PROCESSES_RUNNING >= MAXCHILDREN) {
printf("All processes are busy\n");
continue;
}
int status, childpid;
wait(&status);
childpid = WEXITSTATUS(status);
(*NUM_PROCESSES_RUNNING)--;
printf("There are %d processes running\n", *NUM_PROCESSES_RUNNING);
(void)childpid; // suppress "unused variable" warning
} else {
printf("Wait what\n");
}
} else {
printf("Oops, bad input\n");
}
}
请忽略常量的递增和递减。
现在,这只能部分起作用。每当我给它一个命令来创建另一个进程和 运行 另一个程序(条件操作 == 0,这已经过测试并且可以工作)时,就会发生分叉并且程序被正确执行。
但是,我不能多次分叉。我的意思是:程序分叉并且 child 按照 execv 调用中的指示执行。问题是 parent 进程没有返回到期望输入可能再次分叉,而是等待 child 进程完成。
我试图让这个循环做的是让 parent 始终期待输入并按照命令分叉,必要时有多个 children。但正如我上面解释的那样,parent 得到 "stuck" 等待单个 child 完成,然后才恢复 activity.
提前致谢。
编辑:我试验了多种组合,包括不等待 child 进程、使用额外的 fork 来期待输入等。
来自man wait.2
The wait() system call suspends execution of the calling process until one of its children terminates.
您的程序卡住了,因为那是 wait
所做的。使用 waitpid
代替 WNOHANG
.
waitpid(pid_child, &status, WNOHANG);
不暂停调用进程的执行。您可以阅读 waitpid man page 以找出 return 值以及如何知道 child 是否终止。