创建管道:
int pipe(int filedes[2]);
参数:
filedes【1】:
读
filedes【2】:
写
PS:
小口诀:零度以下(0读1写)。
返回值:
-1--------失败
0 ---------成功
关闭管道:
close(filedes);
PS:
要把两个管道都关闭,即创建一次,关闭两次:
close(fb【0】);close(fb【1】);
写操作:
ssize_t write(int fd, count void* buf, size_t nbyte);
参数:
fd:
文件描述符。
buf:
写入数据的内存单元。
nbyte:
写入文件指定的字节数。
返回值:
-1-------出错
正数----写入的字节数
读操作:
ssize_t read(int fd, void* buf, size_t count);
参数:
fb:
文件描述符。
buf:
读取数据的内存单元
count:
读取文件指定的字节数
返回值:
-1-----出错
0------无数据
正数---读取的字节数
控制:
如果管道是空的,read()默认是阻塞。想要变成非阻塞,需要修改系统参数。
int fcntl(int fd, int cmd, long arg);
参数:
fd:
文件描述符。
cmd:
F_GETFL获取文件描述符状态
F_SETFL设置文件描述符状态
..............................................
arg:
O_NONBLOCK非阻塞
O_BLOCK阻塞
...............................
把文件描述符设置为非阻塞命令:
fcntl(filedes, F_SETFL, O_NONB;OCK);
代码图示:
代码示范:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
int main(){
int fd[2];
pipe(fd);
if(!fork()){// child
close(fd[0]);
char in[] = "Hello pipe";
sleep(3);//等待3S
write(fd[1],in,sizeof(in));
printf("child %d write:%s\n",getpid(),in);
close(fd[1]);
}else{// parent
close(fd[1]);
// fcntl(fd[0],F_SETFL,O_NONBLOCK);//设置为非阻塞
char out[BUFSIZ]={0};
ssize_t n = read(fd[0],out,sizeof(out));
if(-1 == n){
perror("read error");
return -1;
}
printf("parent %d read:%s\n",getpid(),out);
close(fd[0]);
}
}
结果:
3S后出现:
结果显示:
在不设置非阻塞的情况下:读操作会阻塞,必须先写或同时读写才能继续执行下面的程序(子进程中3秒睡眠的时候父进程处于阻塞状态,等待子进程写入)。
在设置非阻塞的情况下:父进程不等子进程写入就开始读取,结果没有读到信息。