linux信号处理函数

发布时间:2024年01月09日

signal

//用于注册信号处理函数
#include <signal.h>
typedef void (*sighandler_t)(int);	//函数指针

sighandler_t signal(int signum,sighandler_t handler);
/*
signum : 信号码,需要处理的信号,例如SIGINT...
handler: 信号函数处理指针,不设置时则可以用常量——忽略该信号(SIG_IGN)和默认处理(SIG_DFL).
*/

例子

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void sigint(int signum)
{
	printf("收到SIGINT信号!!!\n");
}

int main()
{
	if(signal(SIGINT,sigint) == SIG_ERR)	//注册信号处理,当发送SIGINT信号时,将被捕获,该信号SIGINT,则无法使该进程中断
	{
		printf("signal!!!\n");
		return -1;
	}
	return 0;
}

kill

//向进程发送信号,常常用来中断该进程

#include <signal.h>
int kill (pid_t pid, int sig);
/*
pid >  0 - 向pid进程发送sig信号。
pid =  0 - 向同进程组的所有进程发送信号
pid = -1 - 向所有进程发送信号,
           前提是调用进程有向其发送信号的权限。
pid < -1 - 向绝对值等于pid的进程组发信号。
向不存在的进程发送信号,则会返回-1,并且errno为ESRCH
*/

例子

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc,char *argv[]){
	if(argc < 3){//kill 2 7927
		printf("%s sig pid\n",argv[0]);
		return -1;
	}
	int sig = atoi(argv[1]);	//信号SIGINT(2)
	pid_t pid = atoi(argv[2]);	//进程id
	
	int ret = kill(pid,sig);	//向进程7927发送SIGINT信号
	if(ret == -1){
		if(sig == 0 && errno == ESRCH){
			printf("%d进程不存在!\n",pid);
		}
		perror("kill");
		return -1;
	}
	
	return 0;	
}

raise

//向进程自身发送信号

#include <signal.h>
int raise (int sig);
//成功返回0,失败返回-1

例子

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

void sigint(int signum)
{
	printf("%u进程收到SIGINT信号.\n",getpid());
}

int main()
{
	if(signal(SIGINT,sigint) == SIG_ERR)
	{
		printf("signal err!!\n");
		return -1;
	}
	raise(SIGINT);
	
	return 0;
}

pause

//让调用进程进入睡眠状态,直到有信号终止该进程或者被捕获

#include <unistd.h>
int pause (void);

例子

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>

void sigint(int signum)
{
	printf("%u进程收到SIGINT信号.\n",getpid());
}

int main()
{
	pid_t pid = fork();
	if(pid == -1)
	{
		printf("fork err!\n");
		return -1;
	}
	if(pid ==0)	//子进程
	{
		if(signal(SIGINT,sigint) == SIG_ERR)
		{
			printf("signal err!!\n");
			return -1;
		}
		pause();	//子进程进入睡眠
		printf("收到信号,苏醒...\n");

		printf("准备退出");
		return 0;	//子进程退出
	}
	
	sleep(3);
	//父进程去唤醒子进程
	kill(pid,SIGINT);	//向子进程pid发送信号
	wait(NULL);	//等待子进程退出
	
	return 0;
}

alarm

//向进程发送闹钟信号
#include <unistd.h>
unsigned int alarm (unsigned int seconds);
//使内核在seconds秒后,向调用进程发送SIGALRM闹钟信号

例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>

void sigalarm(int sig){
	time_t t = time(NULL);
	struct tm *lt = localtime(&t);
	printf("	%2d:%2d:%2d \n",lt->tm_hour,lt->tm_min,lt->tm_sec);
	alarm(1);//1秒之后又发出SIGALRM信号
}

int main(){
	if(signal(SIGALRM,sigalarm)==SIG_ERR)
	{
		perror("signal");
		return -1;
	}
	alarm(3);	//3秒后发送时钟信号
	int ret = alarm(1);
	printf("%d \n",ret);
	for(;;);
	return 0;	
}

文章来源:https://blog.csdn.net/qq_52575999/article/details/135481976
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。