1.使用有名管道实现,一个进程给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
create.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
//创造一个有名管文件
if(mkfifo("./lalala",0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
system("rm lalala");
return 0;
}
snd.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
//以只写的形式打开管道文件
int wfd=open("./lalala",O_WRONLY);
if(wfd==-1)
{
perror("open error");
return -1;
}
//以追加的形式打开记录文件
int fd=open("./file.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);
if(fd==-1)
{
perror("open file error");
return -1;
}
//发送数据
char wbuf[128]="";
while(1)
{
printf("请输入>>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]=0; //fgets录入时,会将结尾的回车也录进去,将其变成结束符\0
//将数据写到记录文件中
write(fd,wbuf,strlen(wbuf));
//将数据传输到管道文件中
write(wfd,wbuf,strlen(wbuf));
//判断结束语句
if(strcmp(wbuf,"quit")==0)
{
break;
}
}
//关闭文件描述符
close(wfd);
close(fd);
return 0;
}
recv.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
//以读的形式打开管道文件
int rfd=open("./lalala",O_RDONLY);
if(rfd==-1)
{
perror("open error");
return -1;
}
printf("管道文件读端打开\n");
//定义接收容器
char rbuf[128]="";
while(1)
{
bzero(rbuf,sizeof(rbuf));
//读取数据
read(rfd,rbuf,sizeof(rbuf));
//判断结束语句
if(strcmp(rbuf,"quit")==0)
{
break;
}
printf("收到消息为:%s\n",rbuf);
}
//关闭文件描述符
close(rfd);
return 0;
}
发消息端进程:
收消息端进程
记录文件file.txt中:
2.使用有名管道实现两个进程间相互通信
首先要创建两个通道文件
create1.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
//创造一个有名管文件
if(mkfifo("./one",0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
system("rm one");
return 0;
}
create2.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
//创造一个有名管文件
if(mkfifo("./two",0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
system("rm two");
return 0;
}
进程1 : snd.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
//创建一个父子进程
pid_t pid1 = fork();
//父进程
if (pid1 > 0)
{
//以写的形式打开文件
int wfd1 = open("./one", O_WRONLY);
if (wfd1 == -1)
{
perror("open one error");
return -1;
}
//发送信息
char wbuf1[128] = "";
printf("可以开始聊天了\n");
while (1)
{
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 (pid1 == 0)
{
//以读的形式打开文件
int rfd1 = open("./two", O_RDONLY);
if (rfd1 == -1)
{
perror("open two error");
return -1;
}
//定义接收容器
char rbuf1[128] = "";
while (1)
{
bzero(rbuf1, sizeof(rbuf1));
//读取数据
read(rfd1, rbuf1, sizeof(rbuf1));
if (strcmp(rbuf1, "quit") == 0)
{
break;
}
printf("对方:%s\n", rbuf1);
}
close(rfd1);
_exit(EXIT_SUCCESS);
}
else
{
perror("open error");
return -1;
}
//非阻塞回收
waitpid(-1, NULL, WNOHANG);
return 0;
}
进程2:recv.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
//创建一个父子进程
pid_t pid2 = fork();
//父进程
if (pid2 > 0)
{
//以读的形式打开文件
int rfd2 = open("./one", O_RDONLY);
if (rfd2 == -1)
{
perror("open one error");
return -1;
}
//定义接收容器
char rbuf2[128] = "";
while (1)
{
bzero(rbuf2, sizeof(rbuf2));
//读取数据
read(rfd2, rbuf2, sizeof(rbuf2));
if (strcmp(rbuf2, "quit") == 0)
{
break;
}
printf("对方:%s\n", rbuf2);
}
close(rfd2);
}
//子进程
else if (pid2 == 0)
{
//以写的形式打开文件
int wfd2 = open("./two", O_WRONLY);
if (wfd2 == -1)
{
perror("open two error");
return -1;
}
//发送信息
char wbuf2[128] = "";
printf("可以开始聊天了\n");
while (1)
{
fgets(wbuf2, sizeof(wbuf2), stdin);
wbuf2[strlen(wbuf2) - 1] = 0;
//将数据发送到管道文件中
write(wfd2, wbuf2, strlen(wbuf2));
//判断数据
if (strcmp(wbuf2, "quit") == 0)
{
break;
}
}
//关闭文件描述符
close(wfd2);
_exit(EXIT_SUCCESS);
}
else
{
perror("open error");
return -1;
}
//非阻塞回收
waitpid(-1, NULL, WNOHANG);
return 0;
}
运行结果: