华清远见22071班9.8作业

这篇博客详细介绍了使用有名管道(FIFO)实现两个进程(A进程和B进程)之间的通信,以及如何通过B进程发送信号来终止A进程的运行。A进程打开有名管道用于读写,不断接收并打印B进程输入的信息,直到接收到quit才结束。B进程同样利用有名管道与A进程交互,读取用户输入并发送给A进程,当接收到quit时结束。此外,还展示了如何创建一个B进程来通过有名管道获取A进程的PID,并使用信号机制发送SIGKILL信号杀死A进程。

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

1. 父子进程对话、AB进程对话那题 二选一

我选ab进程对话

a进程

#include<stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{
	umask(0);
	if(mkfifo("./myfifo",0777)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}
	printf("mkfifo success\n");
	 int fd = open("./myfifo",O_RDWR);
	 if(fd<0)
	 {
		 perror("open");
		 return -1;
	 }
	 printf("open fifo read and write \n");
	 char buf[128]="";
	 ssize_t res;
	 while(1)
	 {
		 bzero(buf,sizeof(buf));
		 res=read(fd,buf,sizeof(buf));
		 if(res<0)
		 {
			 perror("read");
			 return -1;
		 }
		 if(res==0||strcmp(buf,"quit")==0)
		 {
			 printf("对方结束通信\n");
			 return 0;
		 }
		 printf("b:%s\n",buf);
		 printf("请输入>>");
		 fgets(buf,sizeof(buf),stdin);
		 buf[strlen(buf)-1]='\0';
		
		 res=write(fd,buf,sizeof(buf));
		 if(res<0)
		 {
			 perror("write");
			 return -1;
		 } 
		 if(strcmp(buf,"quit")==0)
		 {
			 break;
		 }
		 sleep(1);
	 }
	 return 0;
}

b进程

#include<stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{
	umask(0);
	if(mkfifo("./myfifo",0777)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}
	printf("mkfifo success\n");
	 int fd = open("./myfifo",O_RDWR);
	 if(fd<0)
	 {
		 perror("open");
		 return -1;
	 }
	 printf("open fifo write and read\n");
	
	 char buf[128]="";
	 ssize_t res;
	 while(1)
	 {
		 printf("请输入>>");
		 fgets(buf,sizeof(buf),stdin);
		 buf[strlen(buf)-1]='\0';
		 res=write(fd,buf,sizeof(buf)); 
		 if(res<0)
		 {
			 perror("write");
			 return -1;
		 }	
		 if(strcmp(buf,"quit")==0)
		 {
			 return 0; 
		 }	 
		 bzero(buf,sizeof(buf));
		 sleep(1);
		 res=read(fd,buf,sizeof(buf));
		 if(res<0)
		 {
			 perror("read");
			 return -1;
		 }
		 if(res==0||strcmp(buf,"quit")==0)
		 {
			 printf("对方结束通信\n");
			break;
		 }
		 printf("a:%s\n",buf);

	 }
	 return 0;
}

 

 

2. 创建AB进程,要求用B进程杀死A进程;  提示:有名管道+信号

a进程(被杀)

#include<stdio.h>
#include<sys/types.h>
#include<signal.h>
#include<unistd.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc, const char *argv[])
{
	umask(0);
	if(mkfifo("./myfifo",0777)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}
	int fd= open("./myfifo",O_WRONLY);
	if(fd<0)
	{
		perror("open");
		return -1;
	}
	pid_t pid=getpid();
	write(fd,&pid,sizeof(pid));
	while(1)
	{
		printf("i am alive");
		sleep(1);
	}
	return 0;
}

b进程

#include<stdio.h>
#include<sys/types.h>
#include<signal.h>
#include<unistd.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc, const char *argv[])
{
	umask(0);
	if(mkfifo("./myfifo",0777)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}
	int fd= open("./myfifo",O_RDONLY);
	if(fd<0)
	{
		perror("open");
		return -1;
	}
	pid_t pid;
	if(read(fd,&pid,sizeof(pid))<0)
	{
		perror("read");
		return -1;
	}
	kill(pid,9);
	printf("杀死成功\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值