在Linux下的C/C++的网络编程之进程中的对话。需要建立两个管道(pipe)。因为pipe是半双工的。简历两个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类型
所属文件:
#include
#include
#include
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获得
所属文件:
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define BUFFER_SIZE 256
const char *write_fifo = "write_fifo";
const char *read_fifo = "read_fifo";
在头文件的基础上建立新的文件mkdir pipe.cpp
#include
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;
}