SIGCONT按预期处理父进程

bqf10yzr  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(107)

我需要父进程停止,直到子进程向它发送唤醒信号。只有在从子进程获得唤醒信号后,父进程才需要继续其余的代码。
我已经做了以下工作,但父进程只显示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;
}
fhg3lkii

fhg3lkii1#

当你调用SIGSTOP时,终端的控制权会返回给你的shell,所以你输入的任何输入都会转到shell。因此,你的原始进程会挂起fgets调用。
你可以通过在shell中运行fg来验证这一点。这将前台处理后台进程,然后你可以输入输入。
如果不知道你要完成的事情的全貌,就很难提供建议。在我看来,信号不是一个理想的IPC(进程间通信)方法。我喜欢使用pipe进行相关进程同步。也就是说,你创建一个管道,调用fork,让每个进程关闭相应的末端,然后,“信令”进程在它想向另一个进程发出信号时关闭写端。另一个进程同时在读端调用poll/select,以便它知道写端何时关闭。

相关问题