进程通信篇——3、信号

本文介绍了Linux中用户进程与内核进程通信的异步机制——信号,以及如何通过`signal()`函数注册信号处理。示例代码展示了如何使用无名管道传递数据,并结合信号实现进程间的交互,特别地,当接收到特定信号时,子进程会发送`SIGKILL`信号结束自身和父进程。
摘要由CSDN通过智能技术生成

用于用户进程与内核进程的通信,一种异步通信机制,
信号是在软件层次上对中断机制的一种模拟

用户进程对信号的响应方式:
 忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。
 捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。
 执行缺省操作:Linux对每种信号都规定了默认操作 

kill -l 可以才看系统默认的信号

我们通过注册信号进行使用,具体流程如下

注册信号函数原型

sighandler_t signal(int signum, sighandler_t handler);

sighandler_t 原型追索:

         typedef void (*sighandler_t)(int);
          <====>
             typedef void (*)(int) sighandler_t;

signum 信号类型,

handler 处理函数

        1)用户自定义
                2)SIG_IGN 忽略
                3)SIG_DFL 默认

 函数原型:int kill(pid_t pid, int sig);
 功能:发送信号给进程组或进程
 参数:pid  >0  指定进程号发送信号
       pid  =0  发送信号给与调用进程在同一个进程组的每一个进程
       pid  =-1  发送信号给允许发送的每一个进程(init除外)
       pid  <-1  发送信号给进程组ID等于-pid的每一个进程
       sig  信号的类型
 返回值:成功  0
         失败  -1
 
 函数原型: int raise(int sig);
 功能:给自己发送信号
 参数:sig  信号的类型
 返回值:成功  0
         失败  非0

以下示例代码演示了无名管道传输数据,添加信号处理

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

#define N 64
int main(int argc, const char *argv[])
{
	pid_t pid;
	int fd[2];
	char buf[N] = "";
	if(pipe(fd) < 0){
		perror("pipe error");
		return -1;
	}
	pid = fork();

	if(pid < 0){
		perror("fork error");
		return -1;
	}
	else if(pid == 0){
		while(1){
			fgets(buf, N, stdin);
			buf[strlen(buf) - 1] = '\0';

			write(fd[1], buf, strlen(buf));

			if(strncmp(buf, "quit", 4) == 0){
				kill(getppid(), SIGKILL);
				raise(SIGKILL);
			}
		}
	}
	else{
		while(1){
			read(fd[0], buf, N);
			printf("read:%s\n", buf);
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值