多进程并发编程----进程间传递文件描述符基础~socketpair函数简介

来源:互联网 发布:烛魔枪一段数据 编辑:程序博客网 时间:2024/04/26 14:43
socketpair函数概要如下:
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
sys/types.h文件需要用来定义一些C宏常量。sys/socket.h文件必须包含进来定义socketpair函数原型。
socketpair函数需要四个参数。他们是:
套接口的域
套接口类型
使用的协议
指向存储文件描述符的指针

类型参数声明了我们希望创建哪种类型的套接口。socketpair函数的选择如下:
SOCK_STREAM
SOCK_DGRAM
对于socketpair函数,protocol参数必须提供为0。
参数sv[2]是接收代表两个套接口的整数数组。每一个文件描述符代表一个套接口,并且与另一个并没有区别。
如果函数成功,将会返回0值。否则将会返回-1表明创建失败,并且errno来表明特定的错误号。

关于流程。fork()函数创建出两个进程,fork()之后这两个进程都会执行主程序中的代码,这个一定要注意!尤其是bind的时候,如果bind两次的话,那就会出错了。一般会在子进程里调用一个带死循环的函数,这样就好了。


使用socketpair函数从子进程传递数据到父进程的例子,当然父子进程可以双向通信的。

#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>int main(){int ret,pid,state,num;int sockfd[2];char buf[32];ret=socketpair(AF_UNIX,SOCK_STREAM,0,sockfd);assert(ret==0);pid=fork();if(pid==0){//child process send fd to parentclose(sockfd[0]);char *msg="socketpair test 1";num=write(sockfd[1],msg,strlen(msg)+1);printf("num=%d\n",num);exit(0);}//parent process recv fd from childret=waitpid(pid,&state,0);if(ret==pid){printf("child is exited\n");close(sockfd[1]);read(sockfd[0],buf,sizeof(buf));printf("buf:[%s]\n",buf);}return 0;}

运行结果:

num=18
child is exited
buf:[socketpair test 1]

1 0
原创粉丝点击