【问题标题】:Sigaction handler in CC中的Sigaction处理程序
【发布时间】:2019-04-11 07:50:11
【问题描述】:

我们有一个任务来解释这段代码。我唯一的问题是理解handle_signal函数,为什么我们使用2个新的sigaction,然后使用“old_treatment”和“rien”?

#define DELAY 1
#define NB_ITERATIONS 60
void handle_signal (int num_signal){
    struct sigaction rien, old_ treatment;
    printf ("Signal %d => ", num_signal);
    printf ("I have received a SIGTSTP.\n");
    rien.sa_handler = SIG_DFL;
    rien.sa_flags = 0;
    sigemptyset (&rien.sa_mask);
    sigaction (SIGTSTP, &rien, &old_ treatment);
    printf ("Then I sleep....\n");
    kill (getpid(), SIGSTOP);
    printf ("They wakes me?\n");
    Sigaction (SIGTSTP, &old_ treatment, NULL);
    printf ("Here we go again!\n");
}

int main (void){
    struct sigaction a;
    int i;
    a.sa_handler = handle_signal;
    sigemptyset (&a.sa_mask);
    sigaction (SIGTSTP, &a, NULL);
    for (i = 1; i < NB_ITERATIONS; i++) {
    sleep (DELAY);
    printf ("%d", i % 10);
    fflush (stdout);}
    printf ("End\n");
    return EXIT_SUCCESS;
}

【问题讨论】:

  • 请格式化您的代码。
  • 您只能从信号处理程序中安全地进行异步信号安全函数调用。 printf() 不是异步信号安全的。见pubs.opengroup.org/onlinepubs/9699919799/functions/…
  • 我没有看到case,也没有看到switch
  • @TimRandall 他已经编辑了这个问题,但现在我想他在问为什么它从小写 sigaction 切换到混合大小写 Sigaction,而不是关于 caseswitch 语句.
  • 是的,但是关于Minimal, Complete, and Verifiable example 的重点是我们不必费力地询问一个错字是真正的错字还是意外的错字,或者代码是否是 实际代码或仅类似它。

标签: c shell unix process signals


【解决方案1】:

这样做的目的是暂时更改SIGTSTP 的操作,然后将其恢复。

sigaction(SIGTSTP, &rien, &old_handler);

将其设置为默认操作,并将之前的操作保存在old_handler

然后它会向自己发送一个SIGSTOP 信号以实际挂起该进程。

当它返回时,这意味着该过程已经继续,所以它放回旧的操作:

sigaction(SIGTSTOP, &old_handler, NULL);

目前尚不清楚为什么需要这样做。如果它通过发送SIGTSTP 信号而不是SIGSTOP 来暂停进程会更有意义。这种情况下需要设置默认动作,否则只会无限递归。

【讨论】:

  • 非常感谢,伙计!
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2020-08-03
相关资源
最近更新 更多