我目前正在嘗試通過使用它們來控制用fork()方法創建的子進程來使用C中的信號。從本質上講,我有一個子進程從linux終端運行「是」命令(該命令只是打印「y」和一個換行符,直到它終止)。我希望能夠用CTRL-Z暫停/恢復這個過程。這就是我得到了現在:使用信號處理程序暫停/恢復子進程
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
pid_t CHILD_PROCESS;
pid_t PARENT_PROCESS;
int isPaused;
void pause_handler(int signo){
if(!isPaused){
printf("Ctrl-Z pressed. Pausing child.\n");
isPaused = 1;
kill(CHILD_PROCESS,SIGSTOP);
}
else if(isPaused){
printf("\nCtrl-Z pressed. Resuming child.\n");
kill(CHILD_PROCESS,SIGCONT);
isPaused = 0;
}
}
int main(int argc, char** argv){
pid_t pid;
PARENT_PROCESS = getpid();
pid = fork();
if(pid == 0){
system("yes");
}
isPaused = 0;
if(pid > 0){
signal(SIGTSTP, SIG_IGN);
signal(SIGSTOP, SIG_IGN);
CHILD_PROCESS = pid;
while(1){
if(signal(SIGTSTP,pause_handler) == SIG_ERR){
printf("Signal Failure");
}
}
}
}
當我運行這個,我能得到「CTRL-Z按下暫停的孩子。」通過按CTRL-Z打印到控制檯,我可以得到「按Ctrl-Z,恢復孩子」。通過再次按CTRL-Z打印到控制檯。但是,它實際上並未實際上一遍又一遍地重新打印「y」。關於爲什麼兒童進程不恢復的任何想法?
'規範'問答是[如何避免在信號處理程序中使用'printf()'](http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in-一個信號處理程序/) –