linux:利用socketpair来在进程间传递描述符_apeng139423的博客-程序员秘密

1.socketpair

2.sendmsg/recvmsg

3.UNIX域套接字传递描述字

功能:创建一个圈双工的流管道

原型:

int socketpair(int domain, int type, int protocol, int sv[2]);

参数 domain :协议家族

   type: 套接字种类

   protocol:协议种类

   sv:返回的套接字对

返回值: 成功返回0, 失败返回-1

通过sockpair创建的全双通管道可以实现父子间进程通讯

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define ERR_EXIT(m) \
    do { \
        perror(m);\
        exit(EXIT_FAILURE);\
    }while(0)

int main(int argc, const char *argv[])
{
    int sockfds[2];
    int ret = socket(PF_UNIX, SOCK_STREAM, 0, sockfds);
    
    if(ret == -1)
        ERR_EXIT("sockpair");
    pid_t pid;
    pid = fork();
    if(pid == -1)
        ERR_EXIT("fork");
    if(pid > 0)
    {
        int val = 0;
        close(sockfd[1]);
        while(1)
        {
            ++val;
            printf("sending data:  %d\n", val);
            write(sockfds[0], &val, sizeof(val));
            read(sockfd[0], &val, sizeof(val));
            printf("data received: %d\n", 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;
    
}

会发现val的值不停的增加,并且在父子间进程被传递;

 

下面我们来看一下更加强大的sendmsg函数

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

struct msghdr {
    void         *msg_name;       /* optional address */
    socklen_t     msg_namelen;    /* size of address */
    struct iovec *msg_iov;        /* scatter/gather array */
    size_t        msg_iovlen;     /* # elements in msg_iov */
    void         *msg_control;    /* ancillary data, see below */
    size_t        msg_controllen; /* ancillary data buffer len */
    int           msg_flags;      /* flags on received message */
};

参数解释:

1.void         *msg_name;       /* optional address */ 
   socklen_t     msg_namelen;

这两个参数确定发送的地址

2。struct iovec *msg_iov;        /* scatter/gather array */

我们要发送的数据存放在这个结构体中

struct iovec {
          void  *iov_base;    /* Starting address */  这个相当于缓冲区
          size_t iov_len;     /* Number of bytes to transfer */ 缓冲区长度
      };

结构如上
++++++

这是一个msghdr的示意图

 

QQ图片20150227141625

3.再下面几个数据时辅助信息。

我们通过自己封装sendmsg实现传递描述符

自己写一个send_fd

转载于:https://www.cnblogs.com/DLzhang/p/4303212.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/apeng139423/article/details/101404837

智能推荐

51nod1076 2条不相交的路径_在树上找出两条不相交的路径 长度分别为_Dave_L的博客-程序员秘密

1076 2条不相交的路径基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题给出一个无向图G的顶点V和边E。进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径。(两条路径不经过相同的边)(注,无向图中不存在重边,也就是说确定起点和终点,他们之间最多只有1条路)

TensorFlow实现人脸识别(4)--------对人脸样本进行训练,保存人脸识别模型_tensorflow 最新人脸训练_阳光非宅男的博客-程序员秘密

经过前面几章的介绍,我们以及可以得到处理好的训练样本图像,在本节中将对这些图像进行训练。主要利用到的是keras。一、构建Dataset类1.1 init 完成初始化工作def __init__(self,path_name): self.train_img = None self.train_labels = None sel...

代码编写原则_weixin_30340775的博客-程序员秘密

1、成员变量之间要空一行;方法之间要空一行,方法之间又聚集关系的,可以通过空两行来进行区隔。2、注释与代码之间要空一行,如下所示。/** is YES when view sits on start frame */@property (nonatomic) BOOL isAtStartFrame;注释的开始要用两个星,表示注释的开始。3、对代码...

剑指offer:二叉树的序列化和反序列化_wly_2014的博客-程序员秘密

二叉树的序列化和反序列化//BinaryTreeNode.h文件#ifndef __BINARY_TREE_NODE__#define __BINARY_TREE_NODE__struct BinaryTreeNode{int val;struct BinaryTreeNode* left;struct BinaryTreeNode* right;Bin

11.2.0.3 RAC IO问题_lmy4710的博客-程序员秘密

http://t.askmaclean.com/thread-897-1-1.html环境:1.OS:[[email protected] ~]# cat /etc/issueOracle Linux Server release 6.3Kernel \r on an \m2.oracle 数据库版本:[[email protected] ~]$ sqlplus / as sysd

记录机器学习有关的网站和资源_码生诗想的博客-程序员秘密

本文汇编了一些机器学习领域的框架、库以及软件(按编程语言排序)。 C++ 计算机视觉CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库OpenCV—它提供C++, C, Python, Java 以及 MATLAB接口,并支持Windows, Linux, Android and Mac OS操作系统。通用机器学习MLPackDLibecoggsharkClosure

随便推点

KVM--Host does not support any virtualization..._weixin_34248118的博客-程序员秘密

现象:virt-install创建新虚拟机时,提示Host does not support any virtualization options。环境:CentOS7,KVM,CPU:Intel(R) Xeon(R) CPU E5-2609,qemu-kvm、qemu-kvm-tools、virt-manager、libvirt virt-install四大件已正常yum安装,selinux已关...

单继承 多继承 菱形继承_python在单继承多继承菱形继承中如何调用父类构造函数_lempoo的博客-程序员秘密

### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法"""一个类继承另外一个类,那么该类就是子类(衍生类),被继承的这个类叫做父类 (基类,超类)继承:(1) 单继承 (2) 多继承python所有的类都默认继承父类 object"""### 单继承#如果子类想调用父类私有的,要先在父类里面定义一个公有的,然后在公有的里面先调出私有,最后就可以间接的调出私有,不能在子类中定义公有class Human(object): hair = "金色" s

检测到域名被墙如何解决?域名被墙怎么快速恢复?_域名被墙是否能恢复_sexrenge的博客-程序员秘密

域名被墙是什么?域名被中国防火墙(GFW)拦住了,GFW不仅限制国内的访问国外网站,也限制国外的访问国内的网站.通常是我们的域名解析到了海外的服务器,网站上可能存在一些在国内不能传播的内容以及敏感词汇,在国内就给限制访问了。怎么确定域名是否被墙?使用国内IP访问网站打不开,但是你通过VPN或者代理工具,用国外ip才能打开,源码屋认为这就是域名被墙了。检测到域名被墙如何解决?域名被墙怎么快速恢复?一、域名被墙:如果域名ping的通却打不开网站(排除服务器宕机),用代理或者使用VPN可以打开一般说明域名被

python常用函数的用法_Python中的基本函数及其常用用法简析_weixin_39923110的博客-程序员秘密

函数解释函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程序段落.函数存在的意义:1. 提高代码的复用性2. 将复杂的逻辑简单化,分功能化函数定义:小知识 : []表示可选 表示必备函数名字最好能直接表示该函数的功能,多个单词之间用_链接 ([参数列表])# 待执行语句# 如果有需要显式返回或定义一个简单的函数:...

深入浅出windows的dll文件_dll文件 优劣_mingbuxuchuan的博客-程序员秘密

<br /><br />不要对我太狠——深入浅出windows的dll文件<br />今天又中木马了,木马咋越来越多了,弄的我的心跋凉跋凉的,经过一查找,发现原来是一个名叫XX的木马,到木马存放目录下面,发现了一个dll文件,心想:小样的,你穿上马甲我也认识你,于是就单击--右键—删除。。。。一个dll文件就这样被删掉了,不要对dll太狠了,要知道这可是程序员的血汗啊。。为什么这样说呢?那我们先来认识一下什么是dll<br />dll实际上是动态链接库的缩写,从windows1.0开始,动态链接库就是整个操

《STL之父访谈录》转载_stl 之父访谈录_xuyang1205的博客-程序员秘密

STL之父访谈录       翻译者 : myan出处: http://www.sgi.com/technology/stl  1995年3月,dr.dobbs journal特约记者, 著名技术书籍作家al stevens采访了stl创始人alexander stepanov. 这份访谈纪录是迄今为止对于stl发展历史的最完备介绍, 侯捷先生在他的stl有关文章里推荐大家阅读这篇文章. 因此我

推荐文章

热门文章

相关标签