socketpair与管道pipe
2017-05-19 21:48
411 查看
在看Android 输入系统的时候,第一次看到socketpair,发现和管道非常相似。唯他们的区别就是socketpair,默认支持全双工,而pipe是半双工的。他们一样只能用在父子进程或者线程之间通信。
下面分别以socketpair和管道实现全双工通信。
下面分别以socketpair和管道实现全双工通信。
管道实现线程间全双工通信
#include<stdio.h> #include<pthread.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #define SIZE 1024 int fd1[2],fd2[2]; //fd1[0]:read, fd1[1]:write void *func_thread1(void *arg) { char buf[SIZE] = {0}; int cnt = 0; while(1) { sprintf(buf,"hello main %d\n",cnt++); write(fd1[1],buf,strlen(buf)); int len = read(fd2[0],buf,SIZE); buf[len] = '\0'; printf("%s",buf); bzero(buf,SIZE); sleep(3); } return NULL; } int main(int agrc,char**argv) { pthread_t thread1_t; /*1. create pipe*/ pipe(fd1); pipe(fd2); /*2. create thread1*/ pthread_create(&thread1_t, NULL, func_thread1, NULL); char buf[SIZE] = {0}; int cnt = 0; char * p = buf; printf("buf[SIZE] sizeof:%d, strlen:%d\n",sizeof(buf),strlen(buf)); printf(" char * p sizeof:%d, strlen:%d\n",sizeof(p),strlen(p)); while(1){ int len = read(fd1[0],buf,SIZE); buf[len] = '\0'; printf("%s",buf); bzero(buf,SIZE); sprintf(buf,"hello thread %d\n",cnt++); write(fd2[1],buf,strlen(buf)); sleep(3); } return 0; }
Socketpair实现线程间全双工通信
#include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> #define SIZE 1024 void *func_thread1(void *arg) { char buf[SIZE] = {0}; int cnt = 0; int fd = (int)arg; while(1) { sprintf(buf,"hello main %d\n",cnt++); write(fd,buf,strlen(buf)); int len = read(fd,buf,SIZE); buf[len] = '\0'; printf("%s",buf); bzero(buf,SIZE); sleep(3); } return NULL; } int main(int agrc,char**argv) { int fd[2]; pthread_t thread1_t; /*1. create socketpair*/ int ret = socketpair(AF_UNIX,SOCK_STREAM,0,fd); if(ret < 0){ perror("socketpair"); exit(-1); } /*2. create thread1*/ pthread_create(&thread1_t, NULL, func_thread1, fd[1]); char buf[SIZE] = {0}; int cnt = 0; char * p = buf; while(1){ int len = read(fd[0],buf,SIZE); buf[len] = '\0'; printf("%s",buf); bzero(buf,SIZE); sprintf(buf,"hello thread %d\n",cnt++); write(fd[0],buf,strlen(buf)); sleep(3); } return 0; }
相关文章推荐
- 进程通信:管道(pipe)和 unix域套接字(socketpair)区别
- 进程通信:管道(pipe)和 unix域套接字(socketpair)区别
- linux shell 管道命令(pipe)使用及与shell重定向区别
- [Pipe]跨域访问命名管道
- linux下的pipe()管道函数
- Linux_ pipe 匿名管道 浅解
- zeromq源代码分析5-3------管道相关的数据结构yqueue, ypipe, pipe等
- 双工pipe的实现: socketpair的用途以及实现
- linux shell 管道命令(pipe)使用及与shell重定向区别
- 运用管道(pipe)进行进程间通信
- linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- Python 3 利用 subprocess 实现管道( pipe )交互操作读/写通信
- 使用windowsAPI穿件匿名管道pipe,父子进程间数据传递
- 无名管道(pipe)使用实例
- linux c学习笔记----管道文件(pipe,popen,mkfifo,pclose,dup2)
- 进程返回linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- Linux进程间通信之管道(pipe)
- socketpair创建双向通信的管道
- 管道pipe
- pyspark用pipe管道调用bash脚本时,遇到Permission Denied问题