【发布时间】:2016-12-28 01:13:30
【问题描述】:
我有一个 C 服务器。该服务器必须处理多个连接和用户的输入(通过一个简单的 ncurses GUI)。所以我创造了两个孩子。
我的问题来自用户界面的主菜单,我需要exit 程序(然后从第一个子进程终止第二个子进程-处理连接-)。
我会尝试用一个小例子来解释自己:
int main(){
pid_t pid;
int status1, status2;
if((pid = fork()) < 0){
perror("main fork failure:");
exit(1);
}
if(pid == 0){
pid = fork();
if(pid == 0){
/*
some stuff the second child does while
the first child is already running
*/
}
/* this is the first child */
int choice;
choice = menu();
switch(choice){
case 1:
break;
case 2:
/*
HERE I have to exit (from the first child first,
and from the program then): how can I kill the
second child that is running to prevent
zombie processes?
*/
// kill() which pid?
exit(2);
break;
}
wait(&status2);
}
wait(&status1);
return 0;
}
那么,如果我不知道第二个孩子pid和第一个孩子,我怎么kill呢?
【问题讨论】:
-
孩子不应该杀死他/她的父母。你的问题是关于设计的。你应该使用
thread或select(如果你在linux上你可以加0来选择,不可移植)。 -
select?我用它来处理套接字,它与我的问题有什么关系?您是在谈论以与fork相关的方式使用select吗? -
我的意思是您使用
fork()不是它的目的。fork()创建一个新的进程,它可以完成您希望它完成的工作。在这里,您希望您的孩子杀死您的父母。这不是fork()的目的。您应该使用处理 ncurses 的线程。使用变量running,在线程停止时设置为false。当此变量为假时,主程序将停止。或者使用 select 来处理0。因此,您可以使用 ncurses 读取用户输入。 -
实际上第一个孩子必须杀死自己的孩子(我在我的问题中称之为第二个孩子),而不是父母......仍然不良行为?我不想再次更改我的代码来引入线程。我的意思是,如果我必须这样做,我会这样做,但我宁愿不这样做
-
你失去了我。谁是ncurses?谁需要杀谁?如果您想杀死父母中的孩子,很容易让他的pid通过叉子返回。你很不清楚。您可以在 fork 之前使用
getpid(),这样孩子就知道他父母的 pid,但它非常难看。