通信方式-有名管道的创建和读写
来源:互联网 发布:jdk和java区别 编辑:程序博客网 时间:2024/05/16 01:59
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>#if 1//创建两个FIFO实现不同进程间的全双工通信 --实现自由通信//有名管道的创建及读写extern int errno;//..............ser.c --服务端int main(){ if(access("write_fifo",F_OK) == -1) { int res = mkfifo("write_fifo",0666); if(res == -1) { printf("errno = %d\n",errno); perror("mkfifo"); exit(1); } } //printf("11111111111111111111111111\n"); //服务端先进行写的操作 ,再进行读的操作 int write_fd = open("write_fifo",O_WRONLY); //以只写方式打开 if(write_fd == -1) { perror("open write_fifo");//打开写管道失败 exit(1); } int read_fd = open("read_fifo",O_RDONLY); if(read_fd == -1) { perror("open read_fifo"); //打开读管道失败 // unlink("read_fifo"); exit(1); } char sendbuf[256]; char recvbuf[256]; pid_t pid1,pid2; int status; pid1=fork();//创建进程 if(pid1 == -1) { printf("create fork error\n"); exit(1); } else if(pid1 == 0)//子进程 { while(1) { read(read_fd,recvbuf,256); printf("Cli:>%s\n",recvbuf); } } else if(pid1>0) { pid2 = fork(); if(pid2 == -1) { printf("create fork2 erroe\n"); exit(1); } if(pid2 == 0) { while(1) { printf("Ser:>"); //if(read_fd == 0) // { // printf("\n"); // } // gets(sendbuf); scanf("%s",sendbuf); if(strcmp(sendbuf,"quit") == 0) //比较是否相等 相等就退出 { close(write_fd);//文件描述符 unlink("write_fifo");//删除管道 break; } write(write_fd,sendbuf,strlen(sendbuf)+1); } } if(pid2 >0) { wait(&status); } } /*while(1) //只能实现你说一句我说一句 { printf("Ser:>"); scanf("%s",sendbuf); write(write_fd,sendbuf,strlen(sendbuf)+1); read(read_fd,recvbuf,256); printf("Cli:>%s\n",recvbuf); }*/ return 0;}//.........cli.c --客户端int main(){ // 对文件是否存在以及文件权限进行检查,若不存在,进入access创建管道 if(access("read_fifo",F_OK) == -1) { int res = mkfifo("read_fifo",0666); if(res == -1) { perror("mkfifo"); exit(1); } } //客户端先进行读的操作 在进行写的操作 int read_fd = open("write_fifo", O_RDONLY); if(read_fd == -1) { perror("open write_fifo"); exit(1); } int write_fd = open("read_fifo",O_WRONLY); if(write_fd == -1) { perror("open read_fifo"); unlink("read_fifo"); exit(1); } int status; char sendbuf[256]; char recvbuf[256]; pid_t pid1,pid2; pid1=fork(); if(pid1 == -1) { printf("create fork error\n"); exit(1); } else if(pid1 == 0) { while(1) { read(read_fd,recvbuf,256); printf("Ser:>%s\n",recvbuf); } } else if(pid1 >0) { pid2 = fork(); if(pid2 ==-1) { printf("create fork2 error\n"); exit(1); } else if(pid2 == 0) { while(1) { printf("Cli:>"); // gets(sendbuf); scanf("%s",sendbuf); if(strcmp(sendbuf,"quit") == 0) { close(write_fd); unlink("read_fifo"); break; } write(write_fd,sendbuf,strlen(sendbuf)+1); } } else if(pid2>0) { wait(&status); } } /* while(1) //只能你说一句我说一句 { read(read_fd,recvbuf,256); printf("Ser:>%s\n",recvbuf); printf("Cli:>"); scanf("%s",sendbuf); write(write_fd,sendbuf,strlen(sendbuf)+1); }*/ return 0;}#endif
阅读全文
0 0
- 通信方式-有名管道的创建和读写
- 有名管道的创建与读写
- 有名管道的通信
- 有名管道的创建
- 有名管道的创建和读取
- Linux系统管道和有名管道的通信机制
- 有名管道的读写程序
- 有名管道FIFO的读写
- 进程间通信方式之有名管道
- Linux下的有名管道(03)---使用函数创建和删除有名管道
- 管道通信的特点及有名管道和无名管道的区别
- Linux下进程的通信方式: 有名管道(命名管道)
- 进程间通信-管道(有名管道和无名管道)
- 进程间通信方式之管道--有名管道
- 进程中通信的‘无名管道’和‘有名管道’的用法和二者的区别
- 有名管道读写实例
- 有名管道读写代码
- 读写有名管道
- PHP环境搭建(4)----安装php
- ssh:connect to host localhost port 22: Connection refused解决方法
- Java的重载和重写区别
- Linux字符设备工作原理
- Codeforces 810A Straight «A» 题解
- 通信方式-有名管道的创建和读写
- 面试题9:斐波那契数列
- 5.21
- 从 dig(nslookup) bind —— windows 下的域名解析服务器信息的查看
- CURL常用命令
- 第5章 8051单片机工作原理
- 静态synchronized方法和非静态synchronized方法的锁对象不是同一个
- NestedScrollView替代了ScrollView解决嵌套难题
- 周、月排行榜设计