【问题标题】:Receiving undeclared SIGALRM SIGSTP error messages, though I have included <signal.h>接收未声明的 SIGALRM SIGSTP 错误消息,尽管我已包含 <signal.h>
【发布时间】:2016-10-06 22:28:54
【问题描述】:

我正在练习信号。在编译代码时,我收到了未声明的 SIGALRM 和未声明的 SIGSTP 错误消息。

main.c:46:16: error: ‘SIGALARM’ undeclared (第一次在这个函数中使用) 信号(SIGALARM, (void (*)(int))sig_alarm);

main.c:68:16: error: ‘SIGSTP’ undeclared (第一次在这个函数中使用) 信号(SIGSTP, (void (*)(int))int_handler);

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>



void sig_alarm(int sig){
    kill(sig,SIGKILL);
}

void parent1(int sig){
    kill(sig, SIGUSR1);
}

void parent2(int sig){
    if(sig == 0){/*child is running*/
        kill(sig, SIGUSR2);
    }else if(sig > 0){/*parent is running*/
        printf("Goodbye!");
        exit(0);
    }
}

void int_handler(int sig){}

void child1(int sig){
    printf("Signal received!");
}

void child2(int sig){
    printf("Child exiting...");
    exit(0);
}

int main(){
    pid_t pid;
    if((pid = fork()) < 0){
        perror("fork error");
    }else if(pid > 0){/*parent*/


        signal(SIGALARM, (void (*)(int))sig_alarm);
        alarm(10);
        signal(SIGTSTP, (void (*)(int))parent1);
        while(1){
            pause();
        }
        alarm(0);


        signal(SIGALARM, (void (*)(int))sig_alarm);

        alarm(10);
        signal(SIGINT, (void (*)(int))parent2);
        while(1){
            pause();
        }
        alarm(0);

    }else{/*child*/


        signal(SIGINT, (void (*)(int))int_handler);
        signal(SIGSTP, (void (*)(int))int_handler);


        signal(SIGUSR1, (void (*)(int))child1);
        while(1){
            pause();
        }



        signal(SIGUSR2, (void (*)(int))child2);
        while(1){
            pause();
        }  
    }
    return 0;
}

【问题讨论】:

标签: c unix signals


【解决方案1】:

读取signal(7) man page 以获取有效的信号名称。

正确的名字是SIGTSTP(或SIGSTOP——不清楚你的确切意图是什么)和SIGALRM

请注意,SIGSTOP 无法被捕获。

【讨论】:

  • 仅供参考:在我的 Ubuntu 16.04 系统上,“man signal”页面没有给出信号名称,但“man 7 signal”给出了它们。
  • @TonyB 是的,没错。链接的手册页显示它也在第 7 节中。我已经更新了答案以更好地反映这一点。
  • SIGSTP 也可能是SIGTSTP 的拼写错误——这是可以发现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
相关资源
最近更新 更多