我需要父进程停止,直到子进程向它发送唤醒信号。只有在从子进程获得唤醒信号后,父进程才需要继续其余的代码。
我已经做了以下工作,但父进程只显示printf语句,不接受输入。请注意,我的输入是一个字符串。不知道为什么父进程不接受任何输入,也不显示最终的printf。任何建议都将受到高度赞赏。
#include <stdio.h>
#include <stdlib.h> // EXIT_FAILURE
#include <unistd.h> // for fork
#include<sys/wait.h> // for wait
#include <signal.h> // for sa_handler
#define SIZE 100 // maximum characters allowed in the chat
int main(){
char ptr[100] = "\0";
pid_t pid = fork(); // fork a processes
if(pid < 0){
perror("Fork #1 failed..\n");
exit(EXIT_FAILURE);
}
else if (pid > 0){ // Parent Process
raise(SIGSTOP);
printf("Please enter message...\n");
fgets(ptr, SIZE, stdin);
printf("Parent Message: \033[0;31m%s\n", ptr); // RED color font
}
else { // Child A
sleep(2);
kill(getppid(), SIGCONT);
exit(0);
}
wait(NULL);
return 0;
}
1条答案
按热度按时间fhg3lkii1#
当你调用
SIGSTOP
时,终端的控制权会返回给你的shell,所以你输入的任何输入都会转到shell。因此,你的原始进程会挂起fgets
调用。你可以通过在shell中运行
fg
来验证这一点。这将前台处理后台进程,然后你可以输入输入。如果不知道你要完成的事情的全貌,就很难提供建议。在我看来,信号不是一个理想的IPC(进程间通信)方法。我喜欢使用
pipe
进行相关进程同步。也就是说,你创建一个管道,调用fork
,让每个进程关闭相应的末端,然后,“信令”进程在它想向另一个进程发出信号时关闭写端。另一个进程同时在读端调用poll
/select
,以便它知道写端何时关闭。