linux下实现两人、三人无序对话功能

对于两个程序之间的进行交互式

本程序主要通过父进程创建两个子进程,通过管道来实现,和两人无序对话的功能一样。只要逻辑清晰,并不难。共需要pipe(有名管道)六根,功能为用于读、写,为了使逻辑清晰,方便讨论,以下1、2、3分别代表程序1、2、3之间的管道,分别对程序之间的管道进项讨论分析:

A B C
1-2 write 1-2 read 1-3 read
1-3 write 2-1 write 3-1 write
2-1 read 2-3 write 2-3 read
3-1 read 3-2 read 3-2 write

以上表格表示的具体含义我在这里举例说明一下。eg:对于A(聊天猪头)而言共有四根管道与其相连,两根用于读,另外两根用于写,1-2管道代表A、B之间的管道A需要进行写操作,而B进行读操作。

  • A:第一人

 1 /*============================================
 2   > Copyright (C) 2014 All rights reserved.
 3   > FileName:1.c
 4   > author:donald
 5   > date:2014/08/22/ 20:28:53
 6   > details:
 7 ==============================================*/
 8
 9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <fcntl.h>
15 #define N 1024
16 int main(int argc, const char *argv[])//12,13,21,31
17 {
18     if(mkfifo(argv[1],0666) == -1 || mkfifo(argv[2],0666) == -1){
19         perror("mkfifo");
20         exit(1);
21     }
22
23     int fd_12,fd_13,fd_21,fd_31;
24     char buf[N];
25     fd_12 = open(argv[1],O_WRONLY);
26     fd_13 = open(argv[2],O_WRONLY);
27     fd_21 = open(argv[3],O_RDONLY);
28     fd_31 = open(argv[4],O_RDONLY);
29
30     printf("open  sucess\n");
31
32     if(fork() == 0){//21  r
33         close(fd_13);
34         close(fd_12);
35         close(fd_31);
36         while(memset(buf,0,N),read(fd_21,buf,N) != 0){
37             printf("from 2:");
38             write(1,buf,strlen(buf));
39         }
40         close(fd_21);
41         exit(1);
42     }
43     if(fork() == 0){//31  r
44         close(fd_13);
45         close(fd_12);
46         close(fd_21);
47         while(memset(buf,0,N),read(fd_31,buf,N) != 0){
48             printf("from 3:");
49             write(1,buf,strlen(buf));
50         }
51         close(fd_31);
52         exit(1);
53     }
54
55     //12 13  w
56     close(fd_21);
57     close(fd_31);
58     while(memset(buf,0,N),fgets(buf,N,stdin) != NULL){
59         write(fd_13,buf,strlen(buf));
60         write(fd_12,buf,strlen(buf));
61     }
62     close(fd_13);
63     close(fd_12);
64     wait(NULL);
65     wait(NULL);
66
67     unlink(argv[1]);
68     unlink(argv[2]);
69     printf("program 1 over\n");
70     return 0;
71 }

1.c

  • B:第二人

 1 /*============================================
 2   > Copyright (C) 2014 All rights reserved.
 3   > FileName:2.c
 4   > author:donald
 5   > date:2014/08/22/ 20:29:02
 6   > details:
 7 ==============================================*/
 8
 9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <fcntl.h>
15 #define N 1024
16 int main(int argc, const char *argv[])
17 {
18
19     if(mkfifo(argv[2],0666) == -1 || mkfifo(argv[3],0666) == -1){
20         perror("mkfifo");
21         exit(1);
22     }
23
24     int fd_12,fd_21,fd_23,fd_32;
25     char buf[N];
26     fd_12 = open(argv[1],O_RDONLY);
27     fd_21 = open(argv[2],O_WRONLY);
28     fd_23 = open(argv[3],O_WRONLY);
29     fd_32 = open(argv[4],O_RDONLY);
30
31     printf("open success\n");
32
33     if(fork() == 0){//12  r
34         close(fd_32);
35         close(fd_21);
36         close(fd_23);
37         while(memset(buf,0,N),read(fd_12,buf,N) != 0){
38             printf("from 1:");
39             write(1,buf,strlen(buf));
40         }
41         close(fd_12);
42         exit(1);
43     }
44
45     if(fork() == 0){//32  r
46         close(fd_12);
47         close(fd_21);
48         close(fd_23);
49         while(memset(buf,0,N),read(fd_32,buf,N) != 0){
50             printf("from 3:");
51             write(1,buf,strlen(buf));
52         }
53         close(fd_32);
54         exit(1);
55     }
56
57     //21 23  w
58     close(fd_12);
59     close(fd_32);
60     while(memset(buf,0,N),fgets(buf,N,stdin) != NULL){
61         write(fd_21,buf,strlen(buf));
62         write(fd_23,buf,strlen(buf));
63     }
64     close(fd_21);
65     close(fd_23);
66     wait(NULL);
67     wait(NULL);
68
69     unlink(argv[2]);
70     unlink(argv[3]);
71     printf("program 2 over\n");
72     return 0;
73 }

2.c

  • C:第三人

 1 /*============================================
 2   > Copyright (C) 2014 All rights reserved.
 3   > FileName:3.c
 4   > author:donald
 5   > date:2014/08/22/ 20:29:13
 6   > details:
 7 ==============================================*/
 8 #include <stdio.h>
 9 #include <stdlib.h>
10 #include <string.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <fcntl.h>
14 #define N 1024
15 int main(int argc, const char *argv[])
16 {
17
18     if(mkfifo(argv[2],0666) == -1 || mkfifo(argv[4],0666) == -1){
19         perror("mkfifo");
20         exit(1);
21     }
22
23     int fd_13,fd_31,fd_23,fd_32;
24     char buf[N];
25     fd_13 = open(argv[1],O_RDONLY);
26     fd_31 = open(argv[2],O_WRONLY);
27     fd_23 = open(argv[3],O_RDONLY);
28     fd_32 = open(argv[4],O_WRONLY);
29
30     printf("open success\n");
31
32     if(fork() == 0){//13  r
33         close(fd_31);
34         close(fd_23);
35         close(fd_32);
36         while(memset(buf,0,N),read(fd_13,buf,N) != 0){
37             printf("from 1:");
38             write(1,buf,strlen(buf));
39         }
40         close(fd_13);
41         exit(1);
42     }
43     if(fork() == 0){//23  r
44         close(fd_13);
45         close(fd_31);
46         close(fd_32);
47         while(memset(buf,0,N),read(fd_23,buf,N) != 0){
48             printf("from 2:");
49             write(1,buf,strlen(buf));
50         }
51         close(fd_23);
52         exit(1);
53     }
54
55     //31 32  w
56     close(fd_13);
57     close(fd_23);
58     while(memset(buf,0,N),fgets(buf,N,stdin) != NULL){
59         write(fd_31,buf,strlen(buf));
60         write(fd_32,buf,strlen(buf));
61     }
62     close(fd_31);
63     close(fd_32);
64     wait(NULL);
65     wait(NULL);
66
67     unlink(argv[2]);
68     unlink(argv[4]);
69     printf("program 3 over\n");
70     return 0;
71 }

3.c

PS:在命令行参数中还需注意的,假设1.c、2.c、3.c的可执行文件为A.out、B.out、C.out。命令行参数分别为:(其实和表格里分析的一样)

            1. ./A.out   12.fifo  13.fifo  21.fifo   31.fifo
            2. ./B.out   12.fifo  21.fifo  23.fifo   32.fifo
            3. ./C.out   13.fifo  31.fifo  23.fifo   32.fifo
时间: 2024-11-03 22:07:39

linux下实现两人、三人无序对话功能的相关文章

Linux下配置两个或多个Tomcat启动

Linux下配置两个或多个Tomcat启动 (2012-08-14 11:59:31) 转载▼ 标签: 杂谈 分类: linux_tomcat 步骤如下: (1)修改/etc/profile文件.添加一组java环境变量,和两组CATALINA环境变量(我没有进行此步骤的设置,可能因为我的Tomcat是免安装版的吧)记得修改完要使其生效,用命令:source /etc/profile JAVA_HOME=/usr/java/jdk1.7.0 PATH=$JAVA_HOME/bin:$PATH C

Linux下的两种服务:RPM包默认安装的服务和源码包安装的服务

有些软件安装到电脑上后就会有一个或多个服务出现在系统服务管理里面,比如Apache,VMware软件等就会出现在计算机服务里面,可以随系统的启动而启动,当然也可以设置不启动,等要用了的时候再去启动,(可以在运行里面输入services.msc直接打开服务列表),但是有些软件安装到电脑后不会有什么服务生成,比如我们的聊天工具QQ. Linux下有两种服务,一种是RPM包默认安装的服务,一种是源码包安装的服务. RPM默认安装的服务在/etc/rc.d/init.d/文件下,执行service sm

linux下查看uuid的三种方法及使用uuid的作用

查看设备的uuid的三种方法,总结如下: 1 命令查看:blkid2 文件查看:ls -l /dev/disk/by-uuid3 命令查看:vol_id /dev/sda1 UUID的作用及意义 1:它是真正的唯一标志符 UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的.如果你在系统中启动的时候,使用盘符挂载时,可能找不到设备而加载失败,而使用UUID挂载时,则不会有这样的问题. 2:设备名并非总是不变的 自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺

rlwrap: command not found和解决linux下sqlplus 提供浏览历史命令行的功能

rlwrap工具可以解决linux下sqlplus 提供浏览历史命令行的功能,和删除先前输入错误的字母等问题 1.安装 需要readline包 这个安装光盘就有 [[email protected] RedHat]# cd RPMS/[[email protected] RPMS]# rpm -Uvh readline*warning: readline-4.3-13.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60eerror: Failed

Linux下的两个辅助编程工具 perf 和 GDB

前几天在实验室做了几个小实验,受益匪浅,写代码倒是其次,最重要的是渐渐了解了真实的 计算机科学 工作方式. 很多工作都可以用 linux 下的工具高效完成,例如 要跑一组实验,其中有两个参数变动,那么就不需要手动运行多次,只用一个 Shell Script 就能完成.配合 awk 效率更高. 其中两个工具真得很受用,一个是 GDB, 一个是 perf.前者用于程序调试,后者用于程序性能侦测. GDB 是linux下很出色的调试器, 很多常用的调试工具,例如 breakpoint, call st

Linux下基础命令(三)

本次发这篇博客比较晚,晚上快12点才发的,到今天一直没有,所以又发了一遍,这个篇文章主要有重定向和管道 | tee  find 等实战操作,还有一些命令参数详解等. 重定向及管道 linux下一切皆文件.文件又可分为:普通文件.目录文件.链接文件和设备文件 Linux系统中使用文件来描述各种硬件,设备资源等 例如:硬盘和分区,光盘等设备文件 brw-rw----+ 1 root cdrom    11,   0 6月  24 16:53 sr0 重定向的含义 文件描述符定义: 是内核为了高效管理

Linux下的文件有三个“时间”

实例 先拿实际操作举例. 下面的实例中,关注code.tgz即可(红色的) 可以无视那个 code 下面一张截图是我在 code 目录下,分别执行 ls -l ls -lc ls -lu 后的运行结果: 可以看到,系统分别打印出了3个不同的时间. 接下来改名,执行 mv code.tgz code1.tgz ls -l ls -lc ls -lu 运行结果如下: 可以看出 对文件改名后, -l 出来的结果发生了改变(更新了时间) 接下来访问,执行 vim code1.tgz (进入vim后,退出

linux下合并两个文件夹

Linux下目录的合并以及文件的覆盖案例: 有两个目录test和new,test目录下有目录和文件,new目录下有更改过的一些test下的目录和文件,以及一些新增的文件,现在对两个目录进行合并以及覆盖test下的旧文件 cp -frap new/* test/ 命令其实非常简单,解释下: -f  强制覆盖,不询问yes/no(-i的默认的,即默认为交互模式,询问是否覆盖) -r  递归复制,包含目录 -a  做一个备份,这里可以不用这个参数,我们可以先备份整个test目录 -p  保持新文件的属

Linux下的两个经典宏定义 转

http://www.linuxidc.com/Linux/2016-08/134481.htm http://blog.csdn.net/npy_lp/article/details/7010752 http://www.linuxdiyf.com/viewarticle.php?id=104768 本文首先介绍Linux下的经典宏定义,感受极客的智慧,然后根据该经典定义为下篇文章作铺垫. offsetof宏定义: // 获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量.#