Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正在尝试在我的shell程序中实现警报。信号处理_C_Signals_Alarm - Fatal编程技术网

C 正在尝试在我的shell程序中实现警报。信号处理

C 正在尝试在我的shell程序中实现警报。信号处理,c,signals,alarm,C,Signals,Alarm,我正在用C构建自己的shell。我想实现一个名为alarm的内置函数,它接受一个整数参数,表示秒数。内置程序只在i秒后(一次)向用户发送一条消息,但shell功能在此期间应继续工作 以下是我到目前为止的情况: int seconds; int main(int argc, char const *argv[], char* envp[]){ ... signal(SIGALRM, alarmHandler); ... } void alarmHandler(int sig)

我正在用C构建自己的shell。我想实现一个名为alarm的内置函数,它接受一个整数参数,表示秒数。内置程序只在i秒后(一次)向用户发送一条消息,但shell功能在此期间应继续工作

以下是我到目前为止的情况:

int seconds;

int main(int argc, char const *argv[], char* envp[]){
   ...
   signal(SIGALRM, alarmHandler);
   ...
}

void alarmHandler(int sig) {
    signal(sig, SIG_IGN);
    alarm(seconds);
    printf("%s\n", "message");
    signal(SIGALRM, alarmHandler);
}
void mainProgram(char* string, char* argument){
    ... //built ins that don't require forking
    pid_t processID = fork();

    if(processID==0){ //child
        if(strcmp(string, "alarm") == 0){
            seconds = atoi(argument);
            signal(SIGALRM, alarmHandler);
    }else{ // parent
        usleep(100000)
    }

显然,这是行不通的。我有点迷路了。我已经试了几个小时了,我不知道该怎么办

也许你对
信号的作用有错误的认识

系统调用可用于设置信号的处理。一般来说,使用系统调用发送信号

奥托,也许是和之间的差异造成了混乱。SystemV信号处理语义可能需要在信号处理函数中调用
信号
(再次)。较新的linux系统至少坚持BSD信号处理语义,这是可靠的,并且不需要再次调用
信号
,除非您想更改被调用的处理程序

作为旁注,一旦您正确地使用了
signal
,我建议您改用
sigaction
。您可以阅读我链接的
signal
手册页面的“便携性”部分,以了解更多关于为什么应该使用
sigaction
而不是
signal

但是以后

除了
kill
系统调用之外,还有其他系统调用可用于发送信号。就像在你的情况下,你可能想使用或

或者,如果您想实现类似
报警
的功能(不使用
报警
设置定时器
),您可以使用单独的进程(可能通过调用
fork
)调用睡眠函数,然后调用
kill
,如下所示:

usleep(100000);
kill(pid, SIGALRM);
在本例中,
pid
将是要向其发送
SIGALRM
信号的进程的进程ID(这是
报警
发送的信号)


希望这有助于回答您的问题。

“不起作用”不是一个适当的问题描述。请更具体地描述你面临的问题。好吧,使用上面的代码,什么都不会发生。所以,如果我输入alarm 4,就好像我刚刚输入了enter,shell会打印出提示。为什么要在alarm handler中设置报警?除非已设置报警,否则不会调用处理程序。