1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
代码:
create.c:
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建一个有名管道文件
if(mkfifo("./linux", 0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
system("rm linux"); //删除管道文件
return 0;
}
send.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, strlen(wbuf));
//判断数据
if(strcmp(wbuf, "quit") == 0)
{
break;
}
}
//关闭文件描述符
close(wfd);
return 0;
}
receive.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 fd = open("./save.txt", O_WRONLY);
if(fd == -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(fd, rbuf, strlen(rbuf));
}
//关闭文件描述符
close(rfd);
close(fd);
return 0;
}
运行结果:
2> 使用有名管道实现两个进程间相互通信
代码:
create.c:
nt main(int argc, const char *argv[])
{
//创建一个有名管道文件
if(mkfifo("./ppone", 0664)==-1)
{
perror("mkfifo error");
return -1;
}
//创建一个有名管道文件
if(mkfifo("./pptwo", 0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
system("rm ppone");
system("rm pptwo");
return 0;
}
chat1.c:
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以读的形式打开文件
int rfd1 = open("./ppone", O_RDONLY);
//以写的形式打开管道文件
int wfd1 = open("./pptwo", O_WRONLY);
if(rfd1 == -1)
{
perror("open error");
return -1;
}
printf("管道文件1已经打开\n");
if(wfd1 == -1)
{
perror("open error");
return -1;
}
printf("管道文件2已经打开\n");
//定义容器
char wbuf1[128] = "";
char rbuf1[128] = "";
//创建子进程
pid_t pid = fork();
//判断父子进程
if(pid > 0)
{
//父进程关闭读文件描述符
close(rfd1);
while (1)
{
printf("请输入:");
fgets(wbuf1, sizeof(wbuf1), stdin);
wbuf1[strlen(wbuf1) - 1] = 0;
// 将数据发送给到管道中
write(wfd1, wbuf1, strlen(wbuf1));
// 判断数据
if (strcmp(wbuf1, "quit") == 0)
{
break;
}
}
//父进程关闭写文件描述符
close(wfd1);
}else if(pid==0)
{
//子文件关闭写文件描述符
close(wfd1);
// 子进程从管道中读取数据
while(1)
{
memset(rbuf1, 0, sizeof(rbuf1));
read(rfd1, rbuf1, sizeof(rbuf1));
// 接收到quit,结束子进程
if(strcmp(rbuf1, "quit") == 0)
{
break;
}
// 接收到的数据
printf("\n接收到的数据:%s\n", rbuf1);
}
//子进程关闭读文件描述符
close(rfd1);
}else
{
perror("fork error");
// 关闭文件描述符
close(wfd1);
close(rfd1);
return -1;
}
return 0;
}
chat2.c:
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以写的形式打开管道文件
int wfd2 = open("./ppone", O_WRONLY);
//以读的形式打开文件
int rfd2 = open("./pptwo", O_RDONLY);
if(rfd2 == -1)
{
perror("open error");
return -1;
}
printf("管道文件2已经打开\n");
if(wfd2 == -1)
{
perror("open error");
return -1;
}
printf("管道文件1已经打开\n");
//定义容器
char wbuf2[128] = "";
char rbuf2[128] = "";
//创建子进程
pid_t pid = fork();
//判断父子进程
if(pid > 0)
{
//子文件关闭写文件描述符
close(wfd2);
// 子进程从管道中读取数据
while(1)
{
memset(rbuf2, 0, sizeof(rbuf2));
read(rfd2, rbuf2, sizeof(rbuf2));
// 接收到quit,结束子进程
if(strcmp(rbuf2, "quit") == 0)
{
break;
}
// 接收到的数据
printf("\n接收到的数据:%s\n", rbuf2);
}
//子进程关闭读文件描述符
close(rfd2);
}else if(pid==0)
{
//父进程关闭读文件描述符
close(rfd2);
while (1)
{
printf("请输入:");
fgets(wbuf2, sizeof(wbuf2), stdin);
wbuf2[strlen(wbuf2) - 1] = 0;
// 将数据发送给到管道中
write(wfd2, wbuf2, strlen(wbuf2));
// 判断数据
if (strcmp(wbuf2, "quit") == 0)
{
break;
}
}
//父进程关闭写文件描述符
close(wfd2);
}else
{
perror("fork error");
// 关闭文件描述符
close(wfd2);
close(rfd2);
return -1;
}
return 0;
}
运行结果:
思维导图: