【Linux】Linux中的信号

信号:是系统预先定义好的某些特定的事件,信号可以被产生,也可以被接收,产生和接收的实体都是进程。

信号的作用:一个进程向另一个进程通知某一件事情的发生。

信号的定义位置:/usr/include/bits/signum.h(在终端输入命令vim /usr/include/bits/signum.h)

信号处理函数:

SIG_ERR出错 ;SIG_DFL默认处理方式 ;SIG_IGN忽略;eg:signal(SIGINT,SIG_DFL)

1、当进程收到信号时,他所做的处理:默认 忽略  捕获(自定义)

修改信号响应的方式:typedef  void(*Fun)(int);

Fun  signal(int signum,Fun fun);//signum信号类型,信号值;fun信号响应函数,第一种SIG_DFL默认处理方式,第二种SIG_IGN忽略,第三种自定义一个方法,编写函数。

 编写程序实现,当用户在键盘上输入Crtl+c时,当前进程输出一个hello world

此修改方式 直到下一次修改之前,就一直沿用此响应方式

子进程状态改变,会默认向父进程发送SIGCHLD信号。

2、在程序中如何给一个进程发送一个信号:用到kill这个系统调用,kill默认发送15信号

int kill(pid_t  pid,int  sigtype);//pid指定发送给哪个进程;sigtype指定发送的信号类型

(1)进程给自己发送信号: kill(getpid(),SIGINT);<===>raise(SIGINT);

(2)kill 的pid参数的四种情况:

  • pid > 0 将信号发送给pid指定进程。
  • pid == 0 将信号发送给同组的所有进程。
  • pid < 0 将信号发送给其进程组ID等于pid绝对值的所有进程。
  • pid == -1 将信号发送给除了没有权限的所有进程。

(3)通过kill方法实现kill命令

//通过kill方法实现kill命令
int main(int argc,char* argv[])
{
	if (argc < 2)
	{
		printf("please input process's pid.again\n");
		exit(0);
	}
	int sigtype = 15;
	int i = 1;
	for (; i < argc; ++i)
	{
		if (i == 1)
		{
			if (strncmp(argv[1], "-9", 2) == 0)
			{
				sigtype = 9;//kill -9 pid对应的是9号信号
                continue;
			}
			if (strncmp(argv[1], "-stop", 5) == 0)
			{
				sigtype = 19;//kill -stop pid对应的是19号信号
                continue;
			}
		}
		int pid = 0;
		sscanf(argv[i], "%d", &pid);
		if (kill(pid, sigtype) == -1)
		{
			perror("kill error\n");
			continue;
		}
	}
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值