簡體   English   中英

在C中使用fork()調用時,程序進入無限循環

[英]Program goes into infinite loop when using the fork() call in C

我現在遇到這個奇怪的問題,基本上我正在嘗試並行執行兩個函數。

出現此問題的小代碼段具有以下目的:只要子功能/子過程中發生新事件,子功能就偵聽某些事件,只要父功能/過程未完成其自身的任務即可。應該終止整個程序。

這是示例代碼片段:

#include<stdio.h>
#include<stdlib.h>

void send();

int main(void)
{
    send();
}

void send()
{

    if( fork() ) { /*child process */

            keep_checking_status(); /*listens to audio related events, and terminate the whole program when some                specific kind of event occurs */
    }
    else {
        /* Parent Process */
        /* The parent process executes different other functions, lines of code here */
        /* code lines */
        func1();
        func2();
        func3();
        func4(); 
        /* More lines of code */

        /* And when no event occurs in the child which means the program is still running and the parent process almost executed all the code it was supposed to do, so finally exit(0); */      
        exit(0); 
    }

}    

現在的問題是,父進程不是只執行一次父進程,而是進入無限狀態,並且不執行所有代碼以到達最后一行func4()exit(0); 和平結束

再次,我希望子進程聽一些我已經處理過的特定音頻事件,而父進程應該只執行其中的代碼行並退出。

父進程中也沒有while循環,它只是執行和計算其他內容的代碼,這就是為什么它感覺很奇怪的原因。

我確實研究了一些fork()用法不同的示例,我嘗試了它們,但問題仍然相同。

編輯:(已解決):重命名函數void send()之后,確定; 使void send11(); ,它現在按我的意願工作。 看來我正在使用的庫send()例如libcurl等)具有一些類似於send()功能,或者它們已經包括了所有為我創建此問題的linux系統send() 我的錯。 如果有人能回答為什么這種永不終止的行為,請發表您的詳細回答,因為通常編譯器會報告名稱沖突,但就我而言,它沒有報告任何錯誤,而是使程序進入了無限狀態。

父進程永遠運行,因為:

1)您的評論是落后的。 父級調用keep_checking_status ,而不是子級。 fork函數向子級返回零,因此if( fork() )在父級中為true(返回非零值)。

2)孩子不會阻止它。 如文檔所述, exit功能終止調用過程 因此,父母將永遠留在keep_checking_status

解決方法可能是修復邏輯,以便反轉父角色和子角色並將孩子的PID保存在父級中,這樣您就可以在完成操作killkill

您的問題是因為您將父進程和子進程混合在一起,導致父進程永遠運行並且不會停止。

引用fork的手冊頁:

成功后,將在父級中返回子進程的PID,在子級中返回0。 如果失敗,則在父級中返回-1,不創建任何子級進程,並適當設置errno。

因此,您的0是父級,在您的情況下,該父級正在運行keep_checking_status()函數。

您只需要稍微改變一下邏輯就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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