基于Linux下C/C++的网络编程之进程(对话)
2016-09-06 15:49
495 查看
在Linux下的C/C++的网络编程之进程中的对话。需要建立两个管道(pipe)。因为pipe是半双工的。简历两个pipe是为了伪装成全双工的pipe。
在头文件的基础上建立新的文件mkdir pipe.cpp
程序进行编译 g++ pipe.cpp -o pipe
./pipe
#pragma once //这是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。 #pragma once是编译器相关的,就是说即使这个编译系统上有效,但在其他编译系统也不一定可以,不过现在基本上已经是每个编译器都有这个杂注了。 #ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式. 在程序中由于对话用到了询问当前时间。所以介绍下time函数, 函数名称: time 函数原型: time_t time(time_t *timer) 函数功能: 得到机器的日历时间或者设置日历时间 函数返回: 机器日历时间 参数说明: timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long类型 所属文件: <time.h> #include<time.h> #include<stdio.h> #include<dos.h> int main() { time_t t;//time_t *time t=time(); printf("The Number of second since january 1,2016 is %ld",t); return 0; } c_time函数依赖于time函数 函数名称: ctime 函数原型: char *ctime(long time) 函数功能: 得到日历时间 函数返回: 返回字符串格式:星期,月,日,小时:分:秒,年 参数说明: time-该参数应由函数time获得 所属文件: <time.h> #include<time.h> #include<stdio.h> #include<dos.h> int main() { time_t t; time(&t); printf("Today is data and time:%s",ctime(&t)); return 0; } 整体单独建立一个头文件mkdir utili.h vim utili.h进入头文件程序编写。 #include<iostream> #include<unistd.h> #include<stdio.h> #include<string.h> #include<sys/wait.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> using namespace std; #define BUFFER_SIZE 256 const char *write_fifo = "write_fifo"; const char *read_fifo = "read_fifo";
在头文件的基础上建立新的文件mkdir pipe.cpp
#include<utili.h> int main() { const char *parent_talk[] = {"Hello!", "Can you tell me time current?", "I have to go ,Bye!", NULL }; const char *child_talk[] = {"Hi!", "No problem!", "Bye-bye!", }; int fd1[2];//文件描述符fd1 int fd2[2];//文件描述符fd2 int res = pipe(fd1); int res = pipe(fd2); if(res == -1) { perror("pipe1"); } if(res == -1) { perror("pipe2"); } pid_t pid;//相当于size_t size ,即pid这个变量定义成pid_t类型。 if(pid == 0) { char buffer[256]; close(fd1[1]);//关闭管道1的write,开启管道1的read close(fd2[0]);//关闭管道2的read,开启管道2的write int i = 0 ; const char* talk = child_talk[i]; while(talk != NULL) { read(fd1[0],buffer,256); printf("Parent :> %s\n",buffer); if(i == 1) { time_t t; time(&t);"%s:%s",talk,ctime(&t)); write(fd2[1],buffer,strlen(buffer)+1); } else { write(fd2[1],talk,strlen(talk)+1); } ++i; talk = child_talk[i]; } close(fd1[0]); close(fd2[1]); } else if(pid > 0) { char buffer[256]; close(fd1[0]);//关闭父进程的读, close(fd2[1]);//关闭父进程的写, int i = 0; const char* talk = parent_talk[i]; while(talk != NULL) { write(fd1[1],talk,strlen(talk)+1); read(fd2[0],buffer,256); printf("Child:> %s\n",buffer); ++i; talk = parent_talk[i]; close(fd1[1]);关闭pipe的write close(fd2[0]);关闭pipe的read } int status; wait(&status); } return 0; }
程序进行编译 g++ pipe.cpp -o pipe
./pipe
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍