2024.8.5 作业

1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

create.c

cs 复制代码
#include <myhead.h>
int main(int argc,const char *argv[])
{
 	if(mkfifo("./linux",0644)==-1)
	{
		perror("mkfifo error");
		return -1;
	}	
	getchar();
	system("rm linux");
    return 0;
}

snd.c

cs 复制代码
#include <myhead.h>
int main(int argc,const char *argv[])
{
    int wfd = open("./linux",O_WRONLY);
    if(wfd==-1)
	{
		perror("open error");
		return -1;
	}	
	char wbuf[128]="";
	while(1)
	{
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		write(wfd,wbuf,strlen(wbuf));
		if(strcmp(wbuf,"quit")==0)
		{
			break;
		}
	}
	close(wfd);
    return 0;
}

recv.c

cs 复制代码
#include <myhead.h>
int main(int argc,const char *argv[])
{
 	int rfd = open("./linux",O_RDONLY);
 	if(rfd==-1)
	{
		perror("open error");
		return -1;
	}	
	int fd = open("./test.txt",O_WRONLY|O_CREAT|O_TRUNC,0644);
	if(fd==-1)
	{
		perror("open error");
		return -1;
	}
	char rbuf[128]="";
	while(1)
	{
		memset(rbuf,0,sizeof(rbuf));
		read(rfd,rbuf,sizeof(rbuf));
		if(strcmp(rbuf,"quit")==0)
		{
			break;
		}
		printf("收到的信息为:%s\n",rbuf);
		write(fd,rbuf,strlen(rbuf));
	}
	close(rfd);
	close(fd);
    return 0;
}

2> 使用有名管道实现两个进程间相互通信

create.c

cs 复制代码
#include <myhead.h>
int main(int argc,const char *argv[])
{
 	if(mkfifo("./linux1",0644)==-1)
	{
		perror("mkfifo perror");
		return -1;
	}	
	if(mkfifo("./linux2",0644)==-1)
	{
		perror("mkfifo perror");
		return -1;
	}
	getchar();
	system("rm linux1");
	system("rm linux2");
    return 0;
}

1.c

cs 复制代码
#include <myhead.h>
int main(int argc,const char *argv[])
{
 	pid_t pid = fork();
 	if(pid<0)
	{
		perror("fork error");
		return -1;
	}	
	else if(pid==0)
	{
		int rfd=-1;
		if((rfd=open("./linux2",O_RDONLY))==-1)
		{
			perror("open error");
			return -1;
		}
		char rbuf[128]="";
		while(1)
		{
			memset(rbuf,0,sizeof(rbuf));
			read(rfd,rbuf,sizeof(rbuf));
			if(strcmp(rbuf,"quit")==0)
			{
				break;
			}
			printf("收到的信息为:%s\n",rbuf);
		}
		close(rfd);
		exit(EXIT_SUCCESS);
	}
	int wfd=-1;
	if((wfd=open("./linux1",O_WRONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	char wbuf[128]="";
	while(1)
	{
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		write(wfd,wbuf,strlen(wbuf));
		if(strcmp(wbuf,"quit")==0)
		{
			break;
		}
	}
	close(wfd);
	wait(NULL);
    return 0;
}

2.c

cs 复制代码
#include <myhead.h>
int main(int argc,const char *argv[])
{
 	pid_t pid = fork();
 	if(pid<0)
	{
		perror("fork error");
		return -1;
	}	
	else if(pid==0)
	{
		int wfd=-1;
		if((wfd=open("./linux2",O_WRONLY))==-1)
		{
			perror("open error");
			return -1;
		}
		char wbuf[128]="";
		while(1)
		{
			printf("请输入>>>");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1]=0;
			write(wfd,wbuf,strlen(wbuf));
			if(strcmp(wbuf,"quit")==0)
			{
				break;
			}
		}
		close(wfd);
		exit(EXIT_SUCCESS);
	}
	int rfd=-1;
	if((rfd=open("./linux1",O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	char rbuf[128]="";
	while(1)
	{
		memset(rbuf,0,sizeof(rbuf));
		read(rfd,rbuf,sizeof(rbuf));
		if(strcmp(rbuf,"quit")==0)
		{
			break;
		}
		printf("收到的信息为:%s\n",rbuf);
	}
	close(rfd);
	wait(NULL);
    return 0;
}

思维导图

相关推荐
ShineWinsu4 天前
对于Linux:进程间通信IPC(匿名管道)的解析
linux·c++·面试·进程·通信·管道·ipc
ShineWinsu4 天前
对于Linux:进程间通信IPC(共享内存)的解析
linux·服务器·面试·笔试·进程·共享内存·ipc
峥无6 天前
《read/write的秘密:文件描述符、重定向与用户态缓冲区》
linux·运维·服务器·进程
a里啊里啊9 天前
软考-软件评测师:知识点整理(二)——操作系统基础知识
操作系统·线程·进程·软考·pv操作·软件评测师
Fanfanaas10 天前
Linux 系统编程 进程篇(五)
linux·服务器·c语言·网络·学习·进程
ShineWinsu11 天前
对于Linux:进程间通信IPC(命名管道)的解析
linux·c++·面试·笔试·进程·ipc·命名管道
ShineWinsu12 天前
对于Linux:动静态库的制作与原理的解析—下
linux·运维·服务器·进程·链接·虚拟地址空间·
九英里路20 天前
OS学习之路——动静态库制作与原理
linux·学习·操作系统·unix·进程·编译·动静态库
陳103020 天前
Linux:进程的基本理解
linux·计算机外设·进程
程序猿编码24 天前
Linux内核级隐身术:进程与端口隐藏技术剖析
linux·运维·服务器·linux内核·进程