【发布时间】:2017-12-05 23:57:21
【问题描述】:
我正在处理一项涉及使用fork 的任务。该程序同时运行两个独立的程序,并告诉用户哪个先完成。如果一个孩子跑完,另一个还在跑的孩子应该立即被杀死。
到目前为止我的代码是这样的......
int main(int argc, char **argv) {
if (argc != 2) {
perror("Invalid number of arguments!");
exit(1);
}
pid_t pid;
pid_t wpid;
int status = 0;
for (int i = 0; i < 2; i++) {
if ((pid = fork()) == 0) {
execv("/bin/sh", argv[i+1]);
}
}
while ((wpid = wait(&status)) > 0);
printf("%s finished first!", <Insert winning program here>);
return 0;
}
据我了解,这会运行程序,并且在子进程完成之前不会让父进程继续。现在我想知道如何终止另一个孩子并返回获胜过程。
【问题讨论】:
-
用
errno中的不确定值调用perror是一个错误。您可能会收到类似Invalid number of arguments!: Success或Invalid number of arguments: Not a type-writer之类的错误消息 -
你为什么在
wait上循环?wait第一次返回时,它会告诉您刚刚完成的孩子的 pid。最明智的说法是,孩子是第一个完成的。实际上,您可以将“完成”定义为让父进程从进程表中获取子进程的数据,因此根据定义,wait首先返回的 pid 是首先完成的子进程的 pid。 -
您的问题是“我怎样才能终止另一个孩子,并返回获胜的过程?”.... 1)在 fork() 之后,“父母”保存了新孩子的 pid。 2)wait会告诉你获胜过程的pid。 3) 使用“kill()”终止“失败”进程。
-
但是我怎样才能立即获得失败进程的pid以便我可以杀死它?