36人参与 • 2025-07-29 • C/C++
socketpair()
是 unix/linux 系统中用于创建一对相互连接的匿名套接字的系统调用,专为 进程间通信 (ipc) 设计。这对套接字在创建后即处于连接状态,无需绑定地址或手动连接,特别适用于父子进程或线程间通信。
#include <sys/types.h> #include <sys/socket.h> int socketpair(int domain, int type, int protocol, int sv[2]);
参数 | 说明 |
---|---|
domain | 协议族:通常为 af_unix (本地通信)或 af_local (同义) |
type | 套接字类型:sock_stream (流式)或 sock_dgram (数据报) |
protocol | 协议:通常为 0 (自动选择) |
sv[2] | 用于存储两个套接字描述符的数组(输出参数) |
返回值 | 成功返回 0 ,失败返回 -1 并设置 errno |
bind()
, listen()
, accept()
, connect()
。fork()
→ 父子进程各关闭一端 → 通过剩余套接字通信。socketpair()
创建套接字对read()
/write()
或 send()
/recv()
通信#include <sys/socket.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int sv[2]; // 套接字对 pid_t pid; char buf[128]; // 1. 创建流式套接字对 if (socketpair(af_unix, sock_stream, 0, sv) == -1) { perror("socketpair"); exit(1); } // 2. 创建子进程 pid = fork(); if (pid < 0) { perror("fork"); exit(1); } if (pid == 0) { // 子进程 close(sv[0]); // 关闭父进程端 // 3. 向父进程发送消息 const char *msg = "hello from child"; write(sv[1], msg, strlen(msg) + 1); // 4. 接收父进程回复 read(sv[1], buf, sizeof(buf)); printf("child received: %s\n", buf); close(sv[1]); // 关闭子进程端 exit(0); } else { // 父进程 close(sv[1]); // 关闭子进程端 // 3. 接收子进程消息 read(sv[0], buf, sizeof(buf)); printf("parent received: %s\n", buf); // 4. 回复子进程 const char *reply = "hello from parent"; write(sv[0], reply, strlen(reply) + 1); close(sv[0]); // 关闭父进程端 wait(null); // 等待子进程退出 } return 0; }
af_unix
/ af_local
af_inet
通常不支持)。类型 | 特性 |
---|---|
sock_stream | 可靠、双向、面向连接的字节流(类似 tcp),无消息边界 |
sock_dgram | 数据报服务(类似 udp),保留消息边界(在 af_unix 中仍可靠) |
扩展标志 | |
sock_nonblock | 非阻塞模式(linux 特有,如 sock_stream | sock_nonblock ) |
sock_cloexec | 执行 exec 时关闭描述符(避免泄漏) |
0
(系统自动选择协议)。特性 | socketpair() | pipe() |
---|---|---|
通信方向 | 双向(全双工) | 单向(半双工) |
数据流类型 | 流式/数据报 | 字节流 |
描述符数量 | 2 个(均可读写) | 2 个(一个读,一个写) |
进程关系 | 需继承描述符(通常用于父子进程) | 同左 |
控制能力 | 支持非阻塞、信号驱动等高级选项 | 功能有限 |
if (socketpair(af_unix, sock_stream, 0, sv) == -1) { switch(errno) { case emfile: // 进程描述符耗尽 perror("too many open files"); break; case eafnosupport: // 不支持的协议族 perror("unsupported address family"); break; case eprotonosupport: // 不支持的协议 perror("unsupported protocol"); break; default: perror("socketpair"); } exit(exit_failure); }
af_unix
(其他协议族如 af_inet
可能不被支持)。fcntl(fd, f_setfl, o_nonblock)
或 sock_nonblock
标志设为非阻塞。sendmsg()
传递描述符)。场景 | 推荐方法 |
---|---|
父子进程双向通信 | socketpair() |
无亲缘关系进程通信 | 命名 unix 套接字 |
简单单向数据流(如日志) | pipe() |
高性能 ipc(linux 特有) | eventfd() /signalfd() |
socketpair()
是进程间双向通信的轻量级解决方案,结合了管道的易用性和套接字的灵活性,尤其适合需要在亲缘进程间高效传递数据的场景。
到此这篇关于c++中socketpair函数示例详解的文章就介绍到这了,更多相关c++ socketpair函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论