linux socketpair
相对于无名管道来说,socketpair也是使用在亲缘进程之间,不过它提供了能够全双工通信的通道
man socketpair:
1 2 3 4 | #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socketpair( int domain, int type, int protocol, int sv[2]); |
该sv保存的两个文件描述符,能写也能读
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/socket.h> int main() { int sockfd[2] = {0}; if (-1 == socketpair(PF_UNIX, SOCK_STREAM, 0, sockfd)) { fprintf (stderr, "socketpair: %d, %s\n" , errno , strerror ( errno )); exit (1); } pid_t pid = fork(); if (pid < 0) { fprintf (stderr, "fork: %d, %s\n" , errno , strerror ( errno )); exit (1); } if (pid == 0) { close(sockfd[1]); char buf[] = "data from child program" ; write(sockfd[0], buf, strlen (buf)); char szRecv[200] = {0}; read(sockfd[0], szRecv, 200); printf ( "in child program, get data: %s\n" , szRecv); close(sockfd[0]); } else { close(sockfd[0]); char szRecv[200] = {0}; read(sockfd[1], szRecv, 200); printf ( "in parent program, get data: %s\n" , szRecv); char buf[] = "data from parent program" ; write(sockfd[1], buf, strlen (buf)); close(sockfd[1]); wait(NULL); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)