1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上
一份
create.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建一个管道文件
if(mkfifo("./linux",0664)==-1)
{
perror("mkfifo error");
return -1;
}
return 0;
}
snd.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//已只写的形式打开管道文件
int wfd=open("./linux",O_WRONLY);
if(wfd==-1)
{
perror("open error");
return -1;
}
printf("管道文件已打开\n");
//往里面写东西
char wbuf[128]="";
while(1)
{
//从终端获取要写入的内容
printf("请输入>>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]='\0';
//将数据发送到管道文件中
write(wfd,wbuf,sizeof(wbuf));
//判断写入的文件
if(strcmp(wbuf,"quit")==0)
{
break;
}
}
//关闭文件
close(wfd);
return 0;
}
recv.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以只读的形式打开管道文件
int rfd=open("./linux",O_RDONLY);
if(rfd==-1)
{
perror("open error");
return -1;
}
printf("管道文件已打开\n");
//已只写的形式打开文件
int fd1=open("./file.text",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd1==-1)
{
perror("open error");
return -1;
}
char rbuf[128]="";
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
//读取信息
read(rfd,rbuf,sizeof(rbuf));
//判断读取的文件
if(strcmp(rbuf,"quit")==0)
{
break;
}
//将读取内容展示到终端
printf("%s\n",rbuf);
//将读取的内容写入到文件中
write(fd1,rbuf,sizeof(rbuf));
//手动添加换行
char a='\n';
write(fd1,&a,1);
}
//关闭文件
close(rfd);
close(fd1);
return 0;
}
2> 使用有名管道实现两个进程间相互通信
create.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建管道1
if(mkfifo("./liunx1",0664)==-1)
{
perror("mkfifo error");
return -1;
}
//创建管道2
if(mkfifo("./liunx2",0664)==-1)
{
perror("mkfifo error");
return -1;
}
return 0;
}
snd.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建管道1
if(mkfifo("./liunx1",0664)==-1)
{
perror("mkfifo error");
return -1;
}
//创建管道2
if(mkfifo("./liunx2",0664)==-1)
{
perror("mkfifo error");
return -1;
}
return 0;
}
ubuntu@ubuntu:work2$ cat snd.c
#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)
{
//以只写的形式打开管道2
int wfd=open("./liunx2",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);
exit(EXIT_SUCCESS);
}
//以只读的形式打开管道1
int rfd=open("./liunx1",O_RDONLY);
if(rfd==-1)
{
perror("open error");
return -1;
}
char rbuf[128]="";
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
//读取管道1中的内容
read(rfd,rbuf,sizeof(rbuf));
if(strcmp(rbuf,"quit")==0)
{
break;
}
printf("收到的信息为:%s\n",rbuf);
}
//关闭文件
close(rfd);
wait(NULL);
return 0;
}
recv.c
#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)
{
//以只读的形式打开管道2
int rfd=open("./liunx2",O_RDONLY);
if(rfd==-1)
{
perror("open error");
return -1;
}
char rbuf[128]="";
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
//读取管道1中的内容
read(rfd,rbuf,sizeof(rbuf));
if(strcmp(rbuf,"quit")==0)
{
break;
}
printf("收到的信息为:%s\n",rbuf);
}
//关闭文件
close(rfd);
exit(EXIT_SUCCESS);
}
//以只写的形式打开管道1
int wfd=open("./liunx1",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);
wait(NULL);
return 0;
}
思维导图