信号通信

本文详细介绍了Linux系统中的信号类型,如SIGKILL、SIGSTOP和SIGCHLD,并探讨了kill函数用于发送信号给进程,signal函数用于设置信号处理方式,以及pause函数如何使进程等待信号。通过示例代码解释了如何编写处理信号的程序并发送信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.信号类型:
linux系统支持的所有信号均定义在/usr/include/asm/signal.h
常见的信号有:
SIGKILL:杀死进程
SIGSTOP:暂停进程
SIGCHLD:子进程停止或者结束时用来通知父进程
函数学习:
1》函数原型:
int kill(pid_t pid ,int sig);
头文件:
#include<sys/types.h>
#include<signal.h>
函数功能:
发送信号给一个进程
返回值:
成功(至少有一个信号被发送):0
失败: -1;
参数:
pid:
如果 pid>0 ,pid 指向信号要送往的进程的进程ID
如果pid=0 sig 将送到所有与电泳kill()那个进程同属一个组的进程。
如果pid=-1 sig 将送到所有有权给其发送信号的调用进程,除了进程1(init)
如果pid<-1 sig 将送到进程组的ID=pid 的每一个进程
sig:
如果sig=0,表示没有任何信号送出,系统通常会利用sig 值是否为0 检验某个进程是否仍在执行。


2》函数原型:
typedef void (*sighandler_t)(int);
注释:为复杂的定义声明一个简单的别名,参考typedef 用法四
sighandler_t :函数指针类型:
sighandler_t signal(int signum,sighandler_t handler);
头文件:
#include <signal.h>
函数功能:
设置信号处理处理方式
返回值:
成功:处理函数的指针
失败:SIGERR
参数:
signum:要处理的信号
handler:对应信号的处理方式;
可能取值:
SIG_IGN:忽略这个信号
SIG_DFL:交给内核处理
用户自定义: 用户处理函数

3》函数原型:
int pause(void);
头文件:
#include<unistd.h>
函数功能:
等待一个信号(pause()导致这个调用pause的进程(或线程)休眠,直到一个信 号被传递)
返回值:
只返回:-1



范例代码:
设计思路说明:首先写一个接受信号,并处理信号的程序->handler.c,send.c 程序发送信号
handler.c
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
void handler(int signum)
{
printf("recv signal is :%d\n",signum);
}
int main()
{
signal(SIGINT,handler);
pause();
}

send.c
#include<sys/types.h>
#include<signal.h>
#include<stdio.h>
int main(int argc ,char *argv[])
{
pid_t pid;
pid=atoi(argv[1]);//handler 程序的pid
kill(pid,SIGINT);
return 0;
}

运行结果:
首先运行handler程序,处于阻塞状态;
然后通过ps -aux 查看handler 程序的pid
运行send程序 ./send pid(handler的进程ID)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值