有名管道 信号 聊天

ls.c

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

int fd;
pid_t yy_pid;
pid_t ls_pid;

void readMsg(int sig)
{
	char buf[50]={0};
	read(fd,buf,sizeof(buf));
	printf("杨洋:%s\n",buf);
}
void xx(int sig)
{
	kill(yy_pid,SIGINT);
	kill(ls_pid,SIGINT);
	exit(1);
}
int main(int argc,char *argv[])
{
		if(argc!=2){
		printf("usage: %s <Fname>\n",argv[0]);
		exit(-1);
	}
	//创建管道文件(某一个名字的管道文件只运行创建一次)
	if(access(argv[1],F_OK)){			//判断文件是否存在
		if(mkfifo(argv[1],0666)){
			perror("mkfifo error");
			exit(-1);
		}
	}
	//往管道文件中写数据
	fd = open(argv[1],O_RDWR);
	if(fd<0){
		perror("open error");
		exit(-1);
	}
	ls_pid = getpid();
	read(fd,&yy_pid,sizeof(yy_pid));
	kill(yy_pid,0);
	write(fd,&ls_pid,sizeof(ls_pid));
	printf("yy_pid:%d  ls_pid:%d\n",yy_pid,ls_pid);
	signal(12, readMsg);
	signal(SIGINT,xx);
	char buf[50];
	while(1)
	{
		bzero(buf,sizeof(buf));
		scanf("%s",buf);
		write(fd,buf,strlen(buf));
		kill(yy_pid,10);
	}
}

yy.c

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

int fd;
pid_t yy_pid;
pid_t ls_pid;

void readMsg(int sig)
{
	char buf[50]={0};
	read(fd,buf,sizeof(buf));
	printf("赵露思:%s\n",buf);
}
void xx(int sig)
{
	kill(ls_pid,SIGINT);
	kill(yy_pid,SIGINT);
	exit(1);
}
int main(int argc ,char *argv[])
{
		if(argc!=2){
		printf("usage: %s <Fname>\n",argv[0]);
		exit(-1);
	}
	//创建管道文件(某一个名字的管道文件只运行创建一次)
	if(access(argv[1],F_OK)){			//判断文件是否存在
		if(mkfifo(argv[1],0666)){
			perror("mkfifo error");
			exit(-1);
		}
	}
	//往管道文件中写数据
	fd = open(argv[1],O_RDWR);
	if(fd<0){
		perror("open error");
		exit(-1);
	}
    yy_pid = getpid();
	write(fd,&yy_pid,sizeof(yy_pid));
	pause();
	//sleep(2);
	read(fd,&ls_pid,sizeof(ls_pid));
	printf("yy_pid:%d  ls_pid:%d\n",yy_pid,ls_pid);
	signal(10, readMsg);
	signal(SIGINT,xx);
	char buf[50];
	while(1)
	{
		bzero(buf,sizeof(buf));
		scanf("%s",buf);
		write(fd,buf,strlen(buf));
		kill(ls_pid,12);
	}
}

执行 gcc ls.c -o ls
./ls TT
后执行 gcc yy.c -o yy
./yy TT
两个终端 一个终端执行一个

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值