(一)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);
int
main(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);
int
main(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);
}