我是 C 中 fork() 函式的新手,并且遇到了一些問題。我一直無法找到我能理解的答案。我有一個父行程,它從用戶那里獲取輸入來通知子行程來更新一個值。我下面是實際程式的簡化版本。我知道我沒有檢查回傳值或類似的東西。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void parentFunc(int *pid);
void childFunc(void);
void countSignal(int signo);
int count = 10000;
int main(void){
signal(SIGUSR1, countSignal);
int pid[3];
// create child processes
pid[2] = fork();
if(pid[2] > 0){
pid[1] = fork();
if(pid[1] > 0){
pid[0] = fork();
if(pid[0] > 0){
parentFunc(pid);
}
else childFunc();
}
else childFunc();
}
else childFunc();
return 0;
}
void parentFunc(int *pid){
signal(SIGUSR1, SIG_DFL);
signal(SIGUSR2, SIG_DFL);
int identifier;
while(1){
identifier = fgetc(stdin) - '0';
kill(pid[identifier-1], SIGUSR1);
}
}
void childFunc(void){
srand(getpid());
while(1){
count -= (rand() % (3001 - 1000) 1000);
sleep(5);
}
}
void countSignal(int signo){
signal(SIGUSR1, countSignal);
count = 2000;
printf("Child %d has been fed by Parent %d\n", getpid(), getppid());
printf("New count level: %d\n", count);
}
當孩子收到信號時,它會跳過 sleep(5) 函式嗎?我遇到的問題是,每次我嘗試更新一個值時,它似乎都會添加 2000,然后立即減去隨機值,而不是每隔 5 秒減去一次。
我希望它接收信號以任何間隔添加 2000,但每 5 秒減去一次。謝謝。
uj5u.com熱心網友回復:
當孩子收到信號時,它會跳過 sleep(5) 函式嗎?
是的,如果信號未被忽略,它會跳過剩余的睡眠時間。從man 3 sleep,強調補充說:
描述
sleep() 導致呼叫執行緒休眠,直到經過以秒為單位指定的實時秒數,或者直到沒有被忽略的信號到達。
回傳值
如果請求的時間已經過去,則為零;如果呼叫被信號處理程式中斷,則回傳休眠的秒數。
考慮到這一點,請考慮以下代碼段:
unsigned seconds = 5;
while (seconds)
seconds = sleep(seconds);
如需更精確,請考慮man 2 nanosleep.
旁白:man 7 signal-safety值得一讀以了解 POSIX 定義為在信號處理程式內部安全執行的內容(不包括呼叫printf)。
也可以看看:sig_atomic_t
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469131.html
標籤:C
