signal()
头文件
#include <signal.h>
函数原型
void (*signal(int signum,void(* handler)(int)))(int);
或者:typedef void(*sig_t) ( int );
或者:sig_t signal(int signum,sig_thandler);
unix环境高级编程的例子
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static void sig_int(int);
int main(void)
{
char buf[4096];
pid_t pid;
int status;
if(signal(SIGINT, sig_int) == SIG_ERR)
{
printf("signal error");
}
printf("%%%%% ");
while(fgets(buf, 4096, stdin) != NULL)
{
if(buf[strlen(buf) - 1] == '\n')
{
buf[strlen(buf) - 1] = 0;
}
if((pid = fork()) < 0)
{
printf("fork error");
}
else if(pid == 0)
{
execlp(buf, buf, (char*)0);
printf("couldn't execute: %s", buf);
exit(127);
}
if((pid = waitpid(pid, &status, 0)) < 0)
{
printf("waitpid error");
}
printf("%% ");
}
exit(0);
}
void sig_int(int signo)
{
printf("interrupt\n%% ");
}
功能
设置某一信号的对应动作
说明
signal()会依参数signum指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。