首页 > 代码库 > Linux环境编程之信号(三):一些信号函数

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

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