一、管道(PIPE)
1.1 函数
- int pipe(int file_descriptor[2]); //建立管道,该函数在数组上填上两个新的文件描述符后返回0,失败返回-1。
file_descriptor[0]用于读出数据,读取时必须关闭写入端,即close(file_descriptor[1]);
file_descriptor[1]用于写入数据,写入时必须关闭读取端,即close(file_descriptor[0]);
只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程).比如fork或exec创建的新进程.
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道.
- ssize_t read(int fd, void * buf, size_t count); //读数据file_descriptor[0]
- ssize_t write (int fd, const void * buf, size_t count); //写数据file_descriptor[1]
1.2 源码
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
typedef struct _IPC_MESSAGE{
int len;
char *body;
}IPC_MSG;
int ipc_read(int fd){
IPC_MSG rMsg;
read(fd,&rMsg.len,sizeof(int));
printf("[read]msg len:%d\n",rMsg.len);
int lenBody = rMsg.len - sizeof(int);
rMsg.body = (char*)malloc(lenBody);
//printf("[read]body len:%d\n",lenBody);
int ret = read(fd,(void*)rMsg.body,lenBody);
//printf("[read]body ret:%d\n",ret);
rMsg.body[lenBody] = '\0';
printf("[read]msg body:%s\n",rMsg.body);
return 0;
}
int ipc_write(int fd,char* buffer){
printf("[write]msg body:%s\n",buffer);
IPC_MSG wMsg;
wMsg.body = buffer;
wMsg.len = sizeof(int) + (strlen(wMsg.body)+1);
printf("[write]msg len:%d\n",wMsg.len);
write(fd,(void*)&wMsg.len,sizeof(int));
write(fd,(void*)wMsg.body,strlen(wMsg.body)+1);
}
int test_ipc_pipe(){
printf("Test for pipe\n