实现AB进程对话:A进程发送一句话后,B进程接收到打印。然后B进程发送一句话,A进程接收后打印;复上述步骤,直到AB接收或者发送完quit后,结束AB进程。
管道A代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
if(mkfifo("./myfifo", 0777) < 0) //创建有名管道1
{
//printf("errno = %d\n", errno);
if(errno != 17) //文件已存在的报错码是17,所以报17时忽略,不打错误码
{
perror("mkfifo");
return-1;
}
}
printf("创建myfifo成功\n");
if(mkfifo("./myfifo2", 0777) < 0) //创建有名管道2
{
//printf("errno = %d\n", errno);
if(errno != 17) //文件已存在的报错码是17,所以报17时忽略,不打错误码
{
perror("mkfifo");
return-1;
}
}
printf("创建myfifo2成功\n");
//只读方式打开管道1
int fd = open("./myfifo", O_RDONLY);
if(fd < 0)
{
perror("open");
return -1;
}
printf("以只读方式打开有名管道成功\n");
//只写方式打开管道2
int fd2 = open("./myfifo2", O_WRONLY);
if(fd2 < 0)
{
perror("open");
return -1;
}
printf("以只写方式打开有名管道myfifo2成功\n");
ssize_t res;
char buf[100] = "";
while(1)
{
//读管道1的内容
bzero(buf, sizeof(buf));
res = read(fd, buf, sizeof(buf));
if(res < 0)
{
perror("read");
return -1;
}
else if(0 == res)
{
printf("写端关闭\n");
break;
}
printf("读成功:%s\n", buf);
if(strcmp(buf, "quit") == 0)
{
break;
}
//往管道2写内容
printf("请输入数据:\n");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf)-1] ='\0';
if(write(fd2, buf, sizeof(buf)) < 0)
{
perror("write");
return -1;
}
else
printf("写入成功\n");
if(strcmp(buf, "quit") == 0)
{
break;
}
}
close(fd);
close(fd2);
return 0;
}
管道B代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
if(mkfifo("./myfifo", 0777) < 0) //创建有名管道1
{
//printf("errno = %d\n", errno);
if(errno != 17) //文件已存在的报错码是17,所以报17时忽略,不打错误码
{
perror("mkfifo");
return-1;
}
}
printf("创建myfifo成功\n");
if(mkfifo("./myfifo2", 0777) < 0) //创建有名管道2
{
//printf("errno = %d\n", errno);
if(errno != 17) //文件已存在的报错码是17,所以报17时忽略,不打错误码
{
perror("mkfifo");
return-1;
}
}
printf("创建myfifo2成功\n");
//只写方式打开管道1
int fd = open("./myfifo", O_WRONLY);
if(fd < 0)
{
perror("open");
return -1;
}
printf("以只写方式打开有名管道成功\n");
//只读方式打开管道2
int fd2 = open("./myfifo2", O_RDONLY);
if(fd2 < 0)
{
perror("open");
return -1;
}
printf("以只读方式打开有名管道myfifo2成功\n");
ssize_t res;
char buf[100] = "";
while(1)
{
//往管道1写内容
printf("请输入数据:\n");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf)-1] ='\0';
if(write(fd, buf, sizeof(buf)) < 0)
{
perror("write");
return -1;
}
else
printf("写入成功\n");
if(strcmp(buf, "quit") == 0)
{
break;
}
//读管道2的内容
bzero(buf, sizeof(buf));
res = read(fd2, buf, sizeof(buf));
if(res < 0)
{
perror("read");
return -1;
}
else if(0 == res)
{
printf("写端关闭\n");
break;
}
printf("读成功:%s\n", buf);
if(strcmp(buf, "quit") == 0)
{
break;
}
}
close(fd);
close(fd2);
return 0;
}
运行结果: