化妆品网站建设规模设想,城市便捷酒店,开电商公司需要什么条件,腾讯域名服务商作业一#xff1a;打开两个终端#xff0c;要求实现AB进程对话【两根管道】 打开两个终端#xff0c;要求实现AB进程对话 A进程先发送一句话给B进程#xff0c;B进程接收后打印B进程再回复一句话给A进程#xff0c;A进程接收后打印重复1.2步骤#xff0c;当收到quit后打开两个终端要求实现AB进程对话【两根管道】 打开两个终端要求实现AB进程对话 A进程先发送一句话给B进程B进程接收后打印B进程再回复一句话给A进程A进程接收后打印重复1.2步骤当收到quit后要结束AB进程 提示两根管道 A终端代码
#include stdio.h
#include sys/types.h
#include sys/stat.h
#include errno.h
#include fcntl.h
#include unistd.h
#include string.h/***************************B终端***************************/ int main(int argc, const char *argv[])
{//创建管道1 A终端写入---管道1---B终端读取if(mkfifo(./fifo,0664) 0){if(errno ! 17){perror(mkfifo);return -1;}}printf(mkfifo pipe1 success __%d__\n,__LINE__);//创建管道2 B终端写入---管道2---A终端读取if(mkfifo(./myfifo,0664) 0){if(errno ! 17){perror(mkfifo);return -1;}}printf(mkfifo pipe2 success __%d__\n,__LINE__);//以读的方式打开管道1int fd_ropen(./fifo,O_RDONLY);if(fd_r 0){perror(open);return -1;}printf(open pipe1 success __%d__\n,__LINE__);//以写的方式打开管道2int fd_wopen(./myfifo,O_WRONLY);if(fd_w 0){perror(open);return -1;}printf(open pipe2 success __%d__\n,__LINE__);char buf[128];ssize_t res 0;int c-1;while(1){//管道1操作读取数据bzero(buf,sizeof(buf));resread(fd_r,buf,sizeof(buf));cstrcmp(buf,quit);//判断B终端输入的是否是quitif(0 c){break;//是quit则退出进程}if(res 0){perror(read);return -1;}if(0 res ){printf(对方进程退出\n);break;}printf(A:%s\n,buf);//管道2操作写入数据printf(请输入 );fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] \0;if((write(fd_w,buf,sizeof(buf))) 0){perror(write);return -1;}//当管道2关闭管道2的写段尝试写入数据则管道破裂退出进程}close(fd_r);close(fd_w);return 0;
}
B终端代码
#include stdio.h
#include sys/types.h
#include sys/stat.h
#include errno.h
#include fcntl.h
#include unistd.h
#include string.h/***************************A终端***************************/int main(int argc, const char *argv[])
{//创建管道1 A终端写入---管道1---B终端读取if(mkfifo(./fifo,0664) 0){if(errno ! 17)//如果错误是已有管道则跳过可正常运行{perror(mkfifo);return -1;}}printf(mkfifo pipe1 success __%d__\n,__LINE__);//创建管道2 B终端写入---管道2---A终端读取if(mkfifo(./myfifo,0664) 0){if(errno ! 17){perror(mkfifo);return -1;}}printf(mkfifo pipe2 success __%d__\n,__LINE__);//以写的方式打开管道1int fd_wopen(./fifo,O_WRONLY);if(fd_w 0){perror(open);return -1;}printf(open pipeA success __%d__\n,__LINE__);//以读的方式打开管道Bint fd_ropen(./myfifo,O_RDONLY);if(fd_r 0){perror(open);return -1;}printf(open pipeB success __%d__\n,__LINE__);char buf[128];ssize_t res 0;int c-1;while(1){//管道1操作写入数据printf(请输入要对B说的话 );fgets(buf,sizeof(buf),stdin); //从终端获取数据buf[strlen(buf)-1] \0; //将\n改成\0if((write(fd_w,buf,sizeof(buf))) 0) //将字符串写进管道A {perror(write);return -1;}//当管道1的读段关闭管道1的写段尝试写入数据则管道破裂退出进程//管道2操作读取数据bzero(buf,sizeof(buf));//清空字符串resread(fd_r,buf,sizeof(buf));//读取B管道中的数据cstrcmp(buf,quit);//将读到的数据与quit比较if(0 c)//如果相同c为0达到退出条件可以退出循环{break;}//printf(写入数据成功 res%ld\n,res);if(res 0)//read函数执行失败返回负数{perror(read);return -1;} if(0 res)//read执行成功但读到了0个数据{printf(对方进程退出\n);break;}//打印从管道2中读取到的数据printf(B:%s\n,buf);}//关闭管道1、管道2close(fd_r);close(fd_w);return 0;
}
A终端结果
ubuntuubuntu:02_fifo$ gcc 03_pipe_w.c -o w
ubuntuubuntu:02_fifo$ ./w
mkfifo pipe1 success __22__
mkfifo pipe2 success __33__
open pipeA success __42__
open pipeB success __50__
请输入要对B说的话 你好我是A
B:你好呀我是B
请输入要对B说的话 你吃饭了吗
B:吃了你呢
请输入要对B说的话 不告诉你
ubuntuubuntu:02_fifo$
B终端结果
ubuntuubuntu:02_fifo$ gcc 02_pipe_r.c -o r
ubuntuubuntu:02_fifo$ ./r
mkfifo pipe1 success __22__
mkfifo pipe2 success __33__
open pipe1 success __42__
open pipe2 success __50__
A:你好我是A
请输入 你好呀我是B
A:你吃饭了吗
请输入 吃了你呢
A:不告诉你
请输入 quit
对方进程退出
ubuntuubuntu:02_fifo$