📄 00000019.htm
字号:
void (*signal(sig,disp))(int) <BR> int sig; <BR> void (*disp)(int); <BR> void (*sigset(sig,disp))(int) <BR> int sig; <BR> void (*disp)(int); <BR> int sighold(sig) <BR> int sig; <BR> int sigrelse(sig) <BR> int sig; <BR> int sigignore(sig) <BR> int sig; <BR> int sigpause(sig) <BR> int sig; <BR> 说明:这些系统调用提供了应用程序对指定信号的简单的信号处理. <BR> signal()和sigset()用于修改信号定位.参数sig指定信号(除了 <BR> SIGKILL和SIGSTOP,这两种信号由系统处理,用户程序不能捕捉到). <BR> disp指定新的信号定位,即新的信号处理函数指针.可以为 <BR> SIG_IGN,SIG_DFL或信号句柄地址. <BR> 若使用signal(),disp是信号句柄地址,sig不能为SIGILL,SIGTRAP <BR> 或SIGPWR,收到该信号时,系统首先将重置sig的信号句柄为SIG_DFL, <BR> 然后执行信号句柄. <BR> 若使用sigset(),disp是信号句柄地址,该信号时,系统首先将该 <BR> 信号加入调用进程的信号掩码中,然后执行信号句柄.当信号句柄 <BR> 运行结束 <BR> 后,系统将恢复调用进程的信号掩码为信号收到前的状态.另外, <BR> 使用sigset()时,disp为SIG_HOLD,则该信号将会加入调用进程的 <BR> 信号掩码中而信号的定位不变. <BR> sighold()将信号加入调用进程的信号掩码中. <BR> sigrelse()将信号从调用进程的信号掩码中删除. <BR> sigignore()将信号的定位设置为SIG_IGN. <BR> sigpause()将信号从调用进程的信号掩码中删除,同时挂起调用 <BR> 进程直到收到信号. <BR> 若信号SIGCHLD的信号定位为SIG_IGN,则调用进程的子进程在终 <BR> 止时不会变成僵死进程.调用进程也不用等待子进程返回并做相 <BR> 应处理. <BR> 返回值:调用成功则signal()返回最近调用signal()设置的disp的值. <BR> 否则返回SIG_ERR. <BR> 例子一:设置用户自己的信号中断处理函数,以SIGINT信号为例: <BR> int flag=0; <BR> void myself() <BR> { <BR> flag=1; <BR> printf("get signal SIGINT\n"); <BR> /*若要重新设置SIGINT信号中断处理函数为本函数则执行以 <BR> *下步骤*/ <BR> void (*a)(); <BR> a=myself; <BR> signal(SIGINT,a); <BR> flag=2; <BR> } <BR> main() <BR> { <BR> while (1) { <BR> sleep(2000); /*等待中断信号*/ <BR> if (flag==1) { <BR> printf("skip system call sleep\n"); <BR> exit(0); <BR> } <BR> if (flag==2) { <BR> printf("skip system call sleep\n"); <BR> printf("waiting for next signal\n"); <BR> } <BR> } <BR> } <BR> 11.kill() <BR> 功能:向一个或一组进程发送一个信号. <BR> 语法:#include <sys/types.h> <BR> #include <signal.h> <BR> int kill(pid,sig); <BR> pid_t pid; <BR> int sig; <BR> 说明:本系统调用向一个或一组进程发送一个信号,该信号由参数sig指 <BR> 定,为系统给出的信号表中的一个.若为0(空信号)则检查错误但 <BR> 实际上并没有发送信号,用于检查pid的有效性. <BR> pid指定将要被发送信号的进程或进程组.pid若大于0,则信号将 <BR> 被发送到进程号等于pid的进程;若pid等于0则信号将被发送到所 <BR> 有的与发送信号进程同在一个进程组的进程(系统的特殊进程除 <BR> 外);若pid小于-1,则信号将被发送到所有进程组号与pid绝对值 <BR> 相同的进程;若pid等于-1,则信号将被发送到所有的进程(特殊系 <BR> 统进程除外). <BR> 信号要发送到指定的进程,首先调用进程必须有对该进程发送信 <BR> 号的权限.若调用进程有合适的优先级则具备有权限.若调用进程 <BR> 的实际或有效的UID等于接收信号的进程的实际UID或用setuid() <BR> 系统调用设置的UID,或sig等于SIGCONT同时收发双方进程的会话 <BR> 号相同,则调用进程也有发送信号的权限. <BR> 若进程有发送信号到pid指定的任何一个进程的权限则调用成功, <BR> 否则调用失败,没有信号发出. <BR> 返回值:调用成功则返回0,否则返回-1. <BR> 例子:假设前一个例子进程号为324,现向它发一个SIGINT信号,让它做 <BR> 信号处理: <BR> kill((pid_t)324,SIGINT); <BR> 12.alarm() <BR> 功能:设置一个进程的超时时钟. <BR> 语法:#include <unistd.h> <BR> unsigned int alarm(sec) <BR> unsigned int sec; <BR> 说明:指示调用进程的超时时钟在指定的时间后向调用进程发送一个 <BR> SIGALRM信号.设置超时时钟时时间值不会被放入堆栈中,后一次 <BR> 设置会把前一次(还未到超时时间)冲掉. <BR> 若sec为0,则取消任何以前设置的超时时钟. <BR> fork()会将新进程的超时时钟初始化为0.而当一个进程用exec() <BR> 族系统调用新的执行文件时,调用前设置的超时时钟在调用后仍 <BR> 有效. <BR> 返回值:返回上次设置超时时钟后到调用时还剩余的时间秒数. <BR> 例子:int flag=0; <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -