[英]C Fork Stray Process
我正在使用fork&有一個問題,如果退出1個分支,則其他分支會迷路。
所謂“雜散”,是指我回到了bash並可以鍵入系統命令,但是服務器一直在光標上方輸出。 該代碼以前通過殺死兩個分支來工作,如果I ^ c 。 由於在混合中添加了套接字,因此客戶端斷開連接導致服務器出現故障。
有人對為什么有想法嗎?
在我的main()中:
printf("\n Server Running Press ^c to quit\n\n");
if (!fork()) { // Debug output
while (1) {
// Do output stuff until ^c signal
fflush(stdout);
}
} else { // Internets
while (1) {
clfd=accept(listenfd, (struct sockaddr*)&claddr, &claddrlen);
if (!fork()) { // Listener
close(clfd);
} else { // Communication branch
num=rand()%16;
//i=recv(clfd, &num, sizeof(num), 0);
send(clfd, &num, 1, 0);
close(clfd);
exit(0);
}
}
exit(0);
}
return 0;
這是從ps:
PID TTY TIME CMD
11159 pts/8 00:00:00 sv_run
11899 pts/8 00:00:00 sv_run
11987 pts/8 00:00:00 ps
21687 pts/8 00:00:01 bash
這是pstree的一部分:
|-sshd---sshd---csh
|-sshd---bash---top
|-2*[sv_run]
|-8*[trashapplet]
|-udevd---udevd
當您按Control + C時 ,您將殺死已創建多個子進程的進程。 默認情況下,殺死父進程不會殺死子進程,因此當您繼續在終端中工作時,它們將繼續運行。 並且由於所有進程共享同一輸出設備,因此輸出是交錯的。
我不確定您實際上期望代碼做什么。 我也不知道您正在使用什么平台。 但是,如果發生這種情況,您想殺死SIGINT
上的進程及其所有子進程,並且您使用的是Linux,那么您可以要求內核在子進程中的父進程死亡后交付SIGHUP
。 有關如何執行此操作的更多詳細信息,請參見如何使父進程退出后子進程死亡?
或者,您必須使服務器在退出時殺死其子進程,例如,使用自定義SIGINT 信號處理程序 。
希望能幫助到你。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.