献给忍哥。
星期四做了通过文件读写实现终端(进程)间的对话,忍哥说好蠢,你说一句我说一句很死板,就不能一个人突然说很多句,自由对话么?课后想了想,实现了这一功能。
通过2文件读写,myfifo记录bro1的话,myfifo1记录bro2的话,2个终端2个程序,程序fork出一个父进程和一个子进程,父进程负责一个文件的写,子进程负责另一文件的读,
写成死循环,sleep(1)1秒刷新一次。
lei141.cc
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>//用vim打开管道文件 无法操作
#include<errno.h>
#include<fcntl.h>
int main()
{
int ret=-1;
ret=mkfifo("/home/lifulin/Pictures/myfifo",0777);
if(-1==ret)
{
if(EEXIST!=errno)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
else
{
printf("myfifo exist\n");
}
}
ret=mkfifo("/home/lifulin/Pictures/myfifo1",0777);
if(-1==ret)
{
if(EEXIST!=errno)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
else
{
printf("myfifo1 exist\n");
}
}
printf("fifo is ok\n");
pid_t pid=-1;
pid=fork();
if(pid>0)
{
int fd=-1;
fd=open("/home/lifulin/Pictures/myfifo",O_RDWR);
int judge=1;
while(1)
{
sleep(1);
char caBuf[32]={'\0'};
ret=read(fd,caBuf,sizeof(caBuf));
if(ret>0)
{
printf("bro1:%s\n",caBuf);
}
if(ret==0)
{
printf("\n");
}
}
close(fd);
}
if(pid==0)
{
int ret=-1;
int fd=-1;
fd=open("/home/lifulin/Pictures/myfifo1",O_RDWR);
int judge=1;
while(1)
{
sleep(1);
char test[32]={"11"};
char caBuf[32]={'\0'};
scanf("%s",caBuf);
ret=write(fd,caBuf,sizeof(caBuf));//只有一端打开,是不写不读的。
if(ret>0)
{
}
if(ret==-1)
{
printf("写入失败\n");
return 0;
}
}
close(fd);
}
if(pid==-1)
{
perror("fork");
exit(EXIT_FAILURE);
}
return 0;
}
lei142.cc
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>//用vim打开管道文件 无法操作
#include<errno.h>
#include<fcntl.h>
int main()
{
pid_t pid=-1;
pid=fork();
if(pid>0)
{
int ret=-1;
int fd=-1;
fd=open("/home/lifulin/Pictures/myfifo",O_RDWR);
int judge=1;
while(1)
{
sleep(1);
char test[32]={"11"};
char caBuf[32]={'\0'};
scanf("%s",caBuf);
ret=write(fd,caBuf,sizeof(caBuf));//只有一端打开,是不写不读的。
if(ret>0)
{
}
if(ret==-1)
{
printf("写入失败\n");
return 0;
}
}
}
if(pid==0)
{
int fd=-1;
int ret=-1;
fd=open("/home/lifulin/Pictures/myfifo1",O_RDWR);
int judge=1;
while(1)
{
sleep(1);
char caBuf[32]={'\0'};
ret=read(fd,caBuf,sizeof(caBuf));
if(ret>0)
{
printf("bro2:%s\n",caBuf);
}
if(ret==0)
{
printf("\n");
}
}
close(fd);
}
if(pid==-1)
{
perror("fork");
exit(EXIT_FAILURE);
}
return 0;
}
lei141.cc和lei142.cc在不同终端下运行,注意文件路径的修改。
网友评论