管道

管道:是一种半双工的通信模式,具有固定的读端和写端,将两个进程之间标准输入和标准输出联系起来,可使用普通的函数read()和write(),不属于任何文件系统,只存在与系统的内核空间。

        1.单工:popen()/pclose()

        管道的操作基于文件流的模式,标准流管道将一系列的创建过程合并与一个popen()中完成(popen()函数执行成功返回文件流指针,出错返回-1) 
      『创建一个管道;
        fork()一个子进程
        在父子进程中关闭不需要的文件描述符;
        执行exec()函数并调用;
        执行函数中所指定的命令;
        pclose()(返回值,需要关闭的文件流);』
2.半双工管道:将某个进程的输出和某个进程的输入单向了联系起来的机制 进程创建管道,每次创建两个文件描述符来操作管道,‘0读1写’
匿名:pipe()函数:int pipe(int filedes[2]);
filedes[]:文件描述符数组,‘0读1写’, 函数执行成功返回0,失败返回-1; 当管道的写端没有关闭时,如果写请求的字节书大于PIPE_BUF,写操 作返回值是管道中目前数据的字节数; 如果请求的字节数小于PIPE_BUF,则返回管道现有字节数
命名:mkfifo()函数:int mififo(const char *pathname,mode_t mode)
在文件系统中命名管道是以设备特殊文件的形式存在的 不同的进程可以通过命名管道共享数据
写入命名管道  
int main(){
int fd = open("/tmp/test",O_WRONLY|O_NONBLOCK);
if(-1== fd){
perror("open error");
return 1;
}
char str[] = "Hello fifo";
write(fd,str,sizeof(str));
printf("write:%s\n",str);
}
读取命名管道 (注意:fifowrite与fiforead要同时执行 ,才会数据传递。否则会阻塞。)
int main(){
int fd = open("/tmp/test",O_RDONLY|O_NONBLOCK);
if(-1 == fd){
perror("open error");
return 1;
}
char buf[BUFSIZ];
bzero(buf,BUFSIZ);
read(fd,buf,BUFSIZ);
printf("read:%s\n",buf);
}

注意:fcntl(fd,F_SETFL,O_NONBLOCK)不能控制命名管道读写阻塞问题。必须在open命名管道时,指定非阻塞打开。


3.全双工:sockerpair()函数;

int socket(int domain,int type,int protocal);
(建立协议族domain,协议类型为type,协议编号为protocal的套接字文件描述符,调用成功,会返回一个表示这个套接字的文件描述符,失败则返回-1),参数admain用于设置网络通信的域,函数socet()根据这个参数选择通信协议的族,参数type用于设置套接字通信的类型。
nt main(){
int sv[2];
socketpair(AF_LOCAL,SOCK_STREAM,0,sv);
printf("%d %d",sv[0],sv[1]);
char str[]="Hello sockerpair\n";
write(sv[0],str,sizeof(str));
char buf[BUFSIZ];
//fcntl(sv[0],F_SETFL,O_NONBLOCK);
read(sv[0],buf,BUFSIZ);
printf("read %s\n",buf);
bzero(buf,BUFSIZ);

read(sv[0],buf,BUFSIZ);
printf("read %s\n",buf);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值