每次按下 ctrl + z 都会生成一个随机数

Everytime ctrl + z is pressed a random number is generated

直奔主题,如何让 Ctrl+z 执行标题所述的操作?

我的程序实现了一个 parent 进程,该进程创建了一个 child 进程。 两个进程都将显示进程 ID,一旦 child 终止,信号将发送到 parent 进程,并且 parent 信号处理程序将显示一条文本,说明信号已被捕获。

在child进程中,除了显示child的进程ID外,每次按下Ctrl+z时,它必须生成一个10到50之间的随机数。到目前为止,我只能让 child 进程生成 1 个随机数。

下面是我的代码:

void main() {
    int pid;
    int x;
    int fd[2];
    const int MAXLINE=4096;
    char line[MAXLINE];

    pid=fork();

    if (pipe(fd) < 0) {
    printf("Pipe error!");
    } 


    if (pid < 0) {
        printf("Fork error!");
    } else if (pid == 0) {                          //Child process
        signal(SIGTSTP, childsignal_handler);
        printf("The process id is: %i\n", getpid());
        sleep(1000);                            //Implemented to wait for a signal
    } else {
        printf("The process id is: %i\n", getpid());            //Parent process
        pause();                            //Waits for the Child process to finish
    }

}

parent 信号处理程序:

void parentsignal_handler(int signo) {                      //Signal Handler for the parent process
    printf("The signal in the parent process has been captured\n");
}

child 信号处理程序:

void childsignal_handler(int signo) {                       //Signal Handler for the child process
    signal(SIGTSTP, childsignal_handler);
    printf("\nThe signal in the child process has been captured\n");
    randomnumbergenerator();
    pause();
}

随机数生成器:

void randomnumbergenerator() {                          //Random number generator to run everytime Ctrl+z is pressed
    //signal(SIGTSTP, childsignal_handler);
    int number;
    int number2 = 10;
    printf("Welcome to random number generator!");
    printf("\nRandom number generated = %d\n", rand() % 40 + 10);
}

PS:我已经阅读了一些关于各种解决方案的文档,例如 sigsuspend、sigprocmask、pause 等等,但是 none 目前为止它们都有效。

以下是我目前已阅读的一些文档:

https://www.gnu.org/software/libc/manual/html_node/Waiting-for-a-Signal.html#Waiting-for-a-Signal https://man7.org/linux/man-pages/man2/pause.2.html

i need to implement a signal that will detect the child terminating

您并不完全需要实施信号;你只需要安装你已经拥有的处理程序:

    signal(SIGCLD, parentsignal_handler);

how do I make Ctrl+z do what the title states?
So far I can only make the child process generate 1 random number.

为了防止父进程被挂起(并因此失去信号传递),请忽略父进程中的 STOP 信号:

    signal(SIGTSTP, SIG_IGN);

你真的应该注意 Ian Abbott 的第一条评论并从信号处理程序中删除 pause();否则在按下 Ctrl-Z 后程序将不会结束。同时将 sleep(…) 更改为 while (sleep(…)) 以保持定时暂停而不是无限的 pause().