首页 > 代码库 > UC高级编程--利用信号实现进程间通信

UC高级编程--利用信号实现进程间通信

/********************************************************************** 
*Copyright (c) 2014,TianYuan 
*All rights reserved. 
* 
* 文件名称: sigin.c 
* 文件标识:无 
* 内容摘要:利用信号实现进程间通信,测试代码. 把要发送的数据存放到文件中,并发送信号.
* 其它说明:无 
* 当前版本: V1.0 
* 作    者: wuyq 
* 完成日期: 20140711 
* 
*修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等 
*修改日期        版本号              修改人         修改内容 
* -------------------------------------------------------------------------------------------------- 
* 20140711         V1.0                wuyq            创建 
**********************************************************************/ 
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>

int main()
{
	pid_t who;
	char buf[100];
	int fd;
	
	printf("qing shu ru dui fang jin cheng id:");
	scanf("%d", &who);	
	
	while(1)
	{
		printf("input send data:");
		scanf(" %[^\n]", buf);
		while(1)
		{
			fd = open("data", O_WRONLY|O_CREAT|O_EXCL, 0666);
			if(fd >= 0)
			{
				break;
			}
			puts("文件已经存在");
			sleep(1);
		}
		write(fd, buf, strlen(buf));
		close(fd);
		kill(who, SIGUSR1);//给进程发送信号
	}
	
	return 0;
}

/********************************************************************** 
*Copyright (c) 2014,TianYuan 
*All rights reserved. 
* 
* 文件名称: sigout.c 
* 文件标识:无 
* 内容摘要:利用信号实现进程间通信,测试代码.收到信号后,从文件读取内容.
* 其它说明:无 
* 当前版本: V1.0 
* 作    者: wuyq 
* 完成日期: 20140711 
* 
*修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等 
*修改日期        版本号              修改人         修改内容 
* -------------------------------------------------------------------------------------------------- 
* 20140711         V1.0                wuyq            创建 
**********************************************************************/    
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

void func(int sig)//信号处理函数
{
	char buf[100];
	
	int fd = open("data", O_RDONLY);
	if(fd < 0) 
	{
		return;
	}
	
	int len = read(fd, buf, sizeof(buf));
	if(len > 0)
	{
		buf[len]='\0';
		puts(buf);//输出文件中读取到的内容
	}
	close(fd);
	unlink("data");//删除文件
}

int main()
{
	signal(SIGUSR1, func);
	printf("pid = %d\n", getpid());
	while(1)
	{
		sleep(1);
	}
	return 0;
}