Linux环境编程之信号(三):一些信号函数

来源:互联网 发布:c语言 编程软件 编辑:程序博客网 时间:2024/05/25 18:12

(一)kill和raise函数

kill函数将信号发送给进程或进程组。raise函数则允许进程自身发送信号。

       #include <sys/types.h>
       #include <signal.h>
       int kill(pid_t pid, int sig);

       int raise(int  signo);  //返回值:若成功则返回0,若出错则返回-1。

参数:pid参数有4种情况:1、pid > 0 将信号发送给进程为pid的进程。2、pid == 0 将该信号发送给与发送进程属于同一进程组的所有进程,而且发送进程具有向这些进程发送信号的权限。3、pid  < 0 将该信号发送给其进程组ID等于pid的绝对值,而且发送进程具有向其发送信号的权限。4、pid == -1 将该信号发送给进程有权限向它们发送信号的系统上的所有进程。signo可以是0,此时kill仍执行正常的错误检查,但不发送信号。这常被用来确定一个特定进程是否仍旧存在。如果向一个并不存在的进程发送空信号,则kill返回-1,并将errno设置为ESRCH。注意:对于进程是否存在的这种测试不是原子操作。在kill向调用者返回测试结果时,原来存在的被测试进程此时可能已经终止。

程序引自:http://blog.csdn.net/jnu_simba/article/details/8944647

#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <signal.h>#define ERR_EXIT(m) \do{\perror(m);\exit(EXIT_FAILURE);\}while(0)void handler(int sig);intmain(int argc, char *argv[]){if(signal(SIGUSR1, handler) == SIG_ERR)ERR_EXIT("signal error");pid_t pid = fork();if(pid == -1)ERR_EXIT("fork error");if(pid == 0){killpg(getpgrp(), SIGUSR1);exit(EXIT_SUCCESS);}int n = 5;do{n = sleep(n);}while(n > 0);return 0;}void handler(int sig){printf("recv a sig = %d\n", sig);}


(二)alarm和pause函数

使用alarm函数可以设置一个计时器,在将来某个指定的时间该计时器会超时。当计时器超时时,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程。

#include <unistd.h>

unsigned int alarm(unsigned int seconds); // 返回值:0或以前设置的闹钟时间的余留秒数。

其中参数seconds的值是秒数,经过了指定的seconds秒后会产生信号SIGALRM,该信号是由内核产生的。

pause函数使调用进程挂起直至捕捉到一个信号。

#include <unistd.h>

int pause(void); //返回值: -1,并将errno设置为EINTR

只有执行一个信号处理程序并返回时,pause才返回。在这种情况下,pause返回-1,并将errno设置为EINTR。

程序引自:http://blog.csdn.net/jnu_simba/article/details/8944647

#include <sys/stat.h>#include <sys/types.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <signal.h>#define ERR_EXIT(m)\do{\perror(m);\exit(EXIT_FAILURE);\}while(0)void handler(int sig);intmain(int argc, char *argv[]){if(signal(SIGALRM, handler) == SIG_ERR)ERR_EXIT("signal error");alarm(1);for(;;)pause();return 0;}void handler(int sig){printf("recv a sig = %d\n", sig);alarm(1);}


0 0
原创粉丝点击