Linux&Apue(0.5.3):进程间通信中信号的基础编程

(一)进程间通信中信号的基础编程

(1) 信号(或:软中断信号)

拓展:
①处理中断信号的地方:中断服务程序
②中断服务程序的入口地址或存放中断服务程序的首地址:中断向量表

1.1 信号定义

信号:是进程间通信的一种有限制的方式,是异步通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。(只做通知,不会给进程传递任何数据。)
关系
①进程之间可以互相通过系统调用kill发送软中断信号。
②内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

1.2 用信号实现父子进程同步示例

1.2.1 流程图

在这里插入图片描述

1.2.2 代码示例
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>

int g_child_stop=0;
int g_parent_run=0;

void sig_child(int signum)
{
	if(SIGUSR1==signum)
	{
		g_child_stop=1;
	}
}
void sig_parent(int signum)
{
	if(SIGUSR2==signum)
	{
		g_parent_run=1;
	}
}
int main(int argc,char **argv)
{
	int	pid;
	int	wstatus;
	//装信号
	signal(SIGUSR1,sig_child);
	signal(SIGUSR2,sig_parent);
	//创建进程
	if((pid=fork())<0)
	{
		printf("create child process failure:%s\n",strerror(errno));
		return -1;
	}
	else if(pid==0)
	{
		printf("child process start running and send parent a signal\n");
		//等待父进程的信号
		kill(getppid(),SIGUSR2);
		while(!g_child_stop)
		{
			sleep(1);
		}
		printf("child process receive signal from parent and exit now\n");
		return 0;
	}
	else
	{
		printf("parent hangs up untill receive signal from child!\n");
		while(!g_parent_run)
		{
			sleep(1);
		}
		printf("parent start running now and send child a signal to exit\n");
		kill(pid,SIGUSR1);
		wait(&wstatus);
		printf("parent wait child process die and exit now\n");
		return 0;
	}
}
1.2.3 出现警告
warning: implicit declaration of function ‘client_tcpinit’ [-Wimplicit-function-declaration]

原因:相关的头文件没有声明这个函数,在相关头文件中声明即可。(即我少输入了#include<string.h>)

1.2.4 运行结果

在这里插入图片描述
我们可以发现,子进程先于父进程运行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值