linux——linux信号2(信号编程)

信号处理函数api:

        入门:signal函数

        高级:sigaction函数

       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

信号发送函数api:

        入门:kill

        高级:sigqueue

       #include <sys/types.h>
       #include <signal.h>

       int kill(pid_t pid, int sig);

代码演示:实现信号ctrl+c,关闭不了进程

#include <signal.h>
#include <stdio.h>
  //     typedef void (*sighandler_t)(int);

  //     sighandler_t signal(int signum, sighandler_t handler);

void handler(int signum)
{
	printf("get signal=%d\n",signum);
	switch(signum){
		case 2:
			printf("SIGINT\n");
			break;
		case 9:
			printf("SIGKILL");
			break;
	}
}

int main()
{
	
	signal(SIGINT,handler);
	signal(SIGKILL,handler);

	while(1);

	return 0;
}

运行结果:

^Cget signal=2
SIGINT
^Cget signal=2
SIGINT
^Cget signal=2
SIGINT
Terminated

ctrl+c无法关闭可以实现,用kill -9 PID绕不过杀死进程,该进程还是被强制退出

代码实现发信号:方法一:

#include <signal.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc,char **argv)
{
	int signum;
	int pid;

	signum=atoi(argv[1]);
	pid=atoi(argv[2]);

//int kill(pid_t pid, int sig);
	kill(pid,signum);
	printf("send signal ok");
	return 0;
}

此处signum与pid位置与上方的kill的api相反,根据实际需求写

./a.out 9 pid号

方法二:

#include <signal.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc,char **argv)
{
	int signum;
	int pid;

	char cmd[128]={0};	

	signum=atoi(argv[1]);
	pid=atoi(argv[2]);

	printf("num=%d,pid=%d\n",signum,pid);
//int kill(pid_t pid, int sig);
	//kill(pid,signum);
	sprintf(cmd,"kill -%d -%d",signum,pid);
	system(cmd);

	printf("send signal ok");
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值