我正在用C语言制作一个学校项目的外壳,如果命令执行该外壳,它可以并行运行进程。
这是等待命令的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,这已经过测试并且可以工作)时,就会发生派生,并且程序正确执行。
但是,我不能多次分叉。我的意思是:程序派生,并且子程序按照execv调用中的指示执行。问题在于,它会等待子进程完成,而不是父进程返回到期望输入再次分叉的状态。
我想让这个周期做的是让父母总是期望输入和派生命令,如果需要,可以有多个孩子。但是正如我在上面解释的那样,父母被“卡住”,等待独生子女完成,然后才恢复活动。
谢谢。
编辑:我已经尝试了不等待子进程,使用额外的fork来期待输入等的多种组合。
答案 0 :(得分:2)
来自man wait.2
wait()系统调用将暂停执行调用过程,直到 它的一个孩子终止。
您的程序被卡住了,因为wait
就是这样做的。使用waitpid
代替WNOHANG
。
waitpid(pid_child, &status, WNOHANG);
不会暂停调用过程的执行。您可以阅读waitpid man page来查找返回值以及如何知道孩子是否终止。