UNIX 进程间通信 -- socketpair 函数

2015-01-07 11:28:26   最后更新: 2015-01-09 15:20:37   访问数量:1493




进程间通信的另一种方式是直接使用已经打开的描述符,比如 socket 描述符,这样一个进程在这个描述符上写数据,一个进程在这个描述符上读数据,即可实现通信

下面的方法可以传递已打开的描述符:

fork 返回后,子进程与父进程共享所有已打开的描述符,同时,exec 执行后,一般已打开的描述符状态仍然会保持不变

但是限制在于必须是父子进程间通信并且只能由父进程传递给子进程

下面即将介绍的 socketpair 函数则没有这样的限制

int socketpair (int family, int type, int protocol, int sockfd[2]);

 

定义于 sys/socket.h

调用成功返回非 0 的连接描述符,出错返回 -1

 

  • family 参数必须为 AF_LOCAL
  • protocol 参数必须为 0
  • type 参数可以选择 SOCK_STREAM 或 DGRAM_STREAM
  • 新创建的两个套接字描述符作为 sockfd[0] 和 sockfd[1] 返回

type 为 SOCK_STREAM 调用 socketpair 得到的结果称为“流管道”(stream pipe)

他与调用 pipe 创建的普通 unix 管道类似,只能在有亲缘关系的进程间通信,差别在于流管道是全双工的,两个描述符既可读又可写

 

#include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while (0) int main(void) { int sockfds[2]; if (socketpair(PF_UNIX, SOCK_STREAM, 0, sockfds) < 0) ERR_EXIT("sockpair"); pid_t pid; pid = fork(); if (pid == -1) ERR_EXIT("fork"); if (pid > 0) { int val = 0; close(sockfds[1]); while (1) { ++val; printf(" sending data: %dn", val); write(sockfds[0], &val, sizeof(val)); read(sockfds[0], &val, sizeof(val)); printf("recv data : %dn", val); sleep(1); } } else if (pid == 0) { int val; close(sockfds[0]); while (1) { read(sockfds[1], &val, sizeof(val)); ++val; write(sockfds[1], &val, sizeof(val)); } } return 0; }

 

 






读书笔记      技术帖      linux      unix      network      计算机网络      unp      unix网络编程      网络编程      socket      龙潭书斋      进程间通信      ipc      socketpair     


京ICP备15018585号