C 正在尝试在我的shell程序中实现警报。信号处理
我正在用C构建自己的shell。我想实现一个名为alarm的内置函数,它接受一个整数参数,表示秒数。内置程序只在i秒后(一次)向用户发送一条消息,但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)
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中设置报警?除非已设置报警,否则不会调用处理程序。