socketpair
2024-08-30 02:18:56
与pipe的区别
pipe产生的文件描述符是半双工的,需要pipe两次才能实现全双工,产生的两个描述符是一个读,一个写
socketpair直接就可以全双工,产生的两个文件描述符的任何一个都可读可写
pipe例子
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int fd1[2],fd2[2];
if(pipe(fd1) < 0 || pipe(fd2) < 0)
exit(-1);
if(fork()){
int val=0;
close(fd1[0]);
close(fd2[1]);
while(1){
sleep(1);
++val;
printf("parent send: %d\n",val);
write(fd1[1],&val,sizeof(val));
read(fd2[0],&val,sizeof(val));
printf("parent received: %d\n",val);
}
}else{
int val;
close(fd1[1]);
close(fd2[0]);
while(1){
read(fd1[0],&val,sizeof(val));
printf("son Data received: %d\n",val);
++val;
write(fd2[1],&val,sizeof(val));
printf("son send: %d\n",val);
}
}
}
socketpair例子
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
int fd[2];
int ret;
ret=socketpair(AF_LOCAL,SOCK_STREAM,0,fd);
if(ret < 0){
perror("socketpair");
exit(-1);
}
if(fork()){
int val=0;
close(fd[1]);
while(1){
sleep(1);
++val;
printf("parent sending data: %d\n",val);
write(fd[0],&val,sizeof(val));
read(fd[0],&val,sizeof(val));
printf("parent Data received: %d\n",val);
}
}else{
int val;
close(fd[0]);
while(1){
read(fd[1],&val,sizeof(val));
printf("son Data received: %d\n",val);
++val;
write(fd[1],&val,sizeof(val));
printf("son send received: %d\n",val);
}
}
}
最新文章
- 前端必须了解的布局常识:普通流(normal flow)
- Glide 图片加载库
- CSS3选择器(一)
- [Javascript] Introduce to Webpack
- 快学Scala-第五章 类
- D - MUH and Cube Walls
- [RHEL 7]ISCSI服务端及客户端连接配置
- conda安装cv2库
- UltraEdit使用(工具类似于notepad++)
- 洛谷P2569 股票交易 [SCOI2010] dp
- 20175317 《Java程序设计》第五周学习总结
- Java诊断工具
- sd错误---2
- PHP Zend Email验证函数MailVal()函数的使用
- 本地开发不用改hosts 也可以绑定域名开发
- 峰Redis学习(9)Redis 集群(概述)
- Eclipse技术: 项目文件中过滤.o文件
- Linux系统结构 详解(转)
- 解决get方法传递URL参数中文乱码问题
- 用 Qt 控制 Nikon 显微镜的电动物镜转盘