通过信号挂起和恢复进程

Suspend and resume process via signals

我这里有两个problems/questions!

1) 我试图抓住 CTRL+Z 并处理它但没有任何反应!!

2) 我如何测试 SIGCONT? (它没有像 CTRL+ .. 这样的快捷方式)

我的代码有什么问题吗?这是我下面的代码:

void sigstop()
{  
   printf(" Suspended\n");
}

void sigcont()
{  
   printf(" Its Back\n");
}

void sigint()
{ 
    printf(" Interrupt\n");
    //exit(0);
}

int main(int argc, char **argv){ 
    printf("Starting the program\n");
    signal(SIGSTOP,sigstop);
    signal(SIGCONT,sigcont);
    signal(SIGINT, sigint);
    while(1) {
        sleep(2);
    }   
    return 0;
}

1) I tried to catch CTRL+Z and handle it but nothing happens!!

CTRL + Z发送SIGTSTP。因此,您需要为 SIGTSTP(而不是 SIGSTOP)设置处理程序。 SIGSTOPSIGKILL 信号无法捕获或处理;所以你的 SIGSTOP 处理程序将被忽略。

2) how can i test the SIGCONT ? (it doesn't have a shortcut like CTRL+ ..)

Shell 通常有一个名为 fg 的内置命令。因此,一旦您使用 CTRL + Z 暂停您的进程,您就可以通过 fg 发送 SIGCONT。 但是您始终可以使用 shell 内置 kill(或 kill 命令)向您的进程发送所需的信号。


您的代码中的其他几个问题:

  1. 信号函数应该是信号void func(int sig) { .. }。所以你需要修复你的信号函数。

  2. printf 不是 async-signal-safe,因此不能从信号处理程序中安全地调用它。