簡體   English   中英

C叉雜散工藝

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM