作為練習,我撰寫了一個 C 程式來處理信號并對它們進行計數等。程式本身實際上是按預期“作業”的,但是:
該程式多次使用 fork(),首先創建一個孩子,然后再分叉兩個孩子(即頂級父母的孫子)。頂級父級等待子級完成,在此之前,子級等待其子級完成。
為了了解發生了什么,我每次執行子代碼時都會列印一條除錯訊息(以確保它只執行一次 - 如預期的那樣)。
這就是我得到的:
Note: Child PID: 28411
Note: Grandchild 2 PID: 28413
Note: Child PID: 28411
Note: Grandchild 1 PID: 28412
Note: Child PID: 28411
Grandchild with PID 28413 called SIGUSR2 1139226 times
Grandchild with PID 28412 called SIGUSR1 1140378 times
Print to console successful
All done!
[Done] exited with code=0 in 5.493 seconds
第一個孩子的電話是正確的,孫子們也很好。但是,由于某種原因,子代碼又被執行了兩次。它也不是一個新行程,因為 PID 是相同的。
這就是我分叉孩子的方式:
pid_t child = fork();
if (child == -1) {
perror("Failure to fork in main\n");
exit(-1);
}
else if (child == 0) {
childCode();
}
else {
wait(NULL);
}
這就是我分叉孫子的方式:
pid_t grandchild1 = fork();
if (grandchild1 == -1) {
// Error
perror("Failure to fork first grandchild");
}
else if (grandchild1 == 0)
// Grandchild
grandchildCode(1);
else {
// Child
pid_t grandchild2 = fork();
if (grandchild2 == -1) {
// Error
perror("Failure to fork second grandchild");
exit(-1);
}
else if (grandchild2 == 0) {
// Grandchild
grandchildCode(2);
}
else {
// Child
wait(NULL);
}
}
因為我不想用無用的代碼弄亂這個執行緒,所以這是 Pastebin 上的完整程式:https ://pastebin.com/XnZEaaNZ (或者我應該把它包括在這里嗎?)
我將非常感謝有關此的任何資訊。我想不通。
uj5u.com熱心網友回復:
輸出表明流程完全按照您的預期作業,問題似乎出在輸出本身,stdout在呼叫下一個 fork 之前沒有及時重繪 ,并將傳遞給孩子,然后孩子們將按預期列印文本因為它在他們的stdout.
如果您在通話fflush(stdout)后放置 a,則可以解決此問題。printf
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467411.html
標籤:C
上一篇:HAL_UART_Transmit_IT如何在STM32F091VB上管理串行發送資料
下一篇:為雙指標的頂層分配記憶體
