socketpair函数_socket框架

socketpair函数_socket框架socketpair函数概要如下:#include 定义一些C宏常量#include 定义socketpair函数原型intsocketpair(intdomain,inttype,intprotocol,intsv[2]);socketpair函数需要四个参数:domain-套接口的域type-套接口类型protocol-使用的协议sv[2

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用
socketpair函数概要如下:

#include <sys/types.h> 定义一些C宏常量

#include <sys/socket.h> 定义socketpair函数原型

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

socketpair函数需要四个参数:

domain-套接口的域

type-套接口类型

protocol-使用的协议

sv[2]-指向存储文件描述符的指针

类型参数声明了我们希望创建哪种类型的套接口,socketpair函数的选择如下:

SOCK_STREAM

SOCK_DGRAM

对于socketpair函数,protocol参数必须提供为0。

参数sv[2]是接收代表两个套接口的整数数组。每一个文件描述符代表一个套接口,并且与另一个并没有区别。

如果函数成功,将会返回0值。否则将会返回-1表明创建失败,并且errno来表明特定的错误号。

socketpair可以用于多进程间全双工通讯。

1.调用socketpair,成功后便有两个socket文件描述符,一个socket就像是一个pipe。

    在两个socket中指定一个给父进程使用,另外一个给子进程使用。不用在意指定哪一个socket给父进程使用,随便挑一个就可以了。

2.调用fork,成功后就创建了子进程

    2.1 fork返回0,那就是子进程,关闭父进程的socket,保留子进程的socket

    2.2 fork返回非0,那就是父进程,关闭子进程的socket,保留父进程的socket

    为什么要关闭socket,现在还没有搞清楚。

3.现在有父子两个进程,每个进程都有一个socket描述符用以代表同一个pipe的两端。如果父进程调用write,那么子进程就调用read,反之亦然。

以下是一个代码示例片段:

void child(int socket) {
    const char hello[] = "hello parent, I am child";
    write(socket, hello, sizeof(hello)); /* NB. this includes nul */
    /* go forth and do childish things with this end of the pipe */
}

void parent(int socket) {
    /* do parental things with this end, like reading the child's message */
    char buf[1024];
    int n = read(socket, buf, sizeof(buf));
    printf("parent received '%.*s'\n", n, buf);
}

void socketfork() {
    int fd[2];
    static const int parentsocket = 0;
    static const int childsocket = 1;
    pid_t pid;

    /* 1. call socketpair ... */
    socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);

    /* 2. call fork ... */
    pid = fork();
    if (pid == 0) { /* 2.1 if fork returned zero, you are the child */
        close(fd[parentsocket]); /* Close the parent file descriptor */
        child(fd[childsocket]);
    } else { /* 2.2 ... you are the parent */
        close(fd[childsocket]); /* Close the child file descriptor */
        parent(fd[parentsocket]);
    }
    exit(0); /* do everything in the parent and child functions */
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182106.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm配置django环境_pycharm的terminal默认环境

    pycharm配置django环境_pycharm的terminal默认环境PyCharmDatabaseserverTimezonePyCharm中有提供视图化的数据库工具——Database,在使用这个工具的时候,因为时区设置的问题,会导致连接不成功。报错信息如下:Serverreturnsinvalidtimezone.Goto’Advanced’tabandset’serverTimezone’propertymanually….

    2022年8月30日
    4
  • python 自动化操作 模块_自动化的基本原理

    python 自动化操作 模块_自动化的基本原理1)什么是xlrd模块?python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel(excelread),xlwt是写excel(excelwrite)的库。(2)为什么使用xlrd模块?在UI自动化或者接口自动化中数据维护是一个核心,所以此模块非常实用。xlrd模块可以用于读取Excel的数据,速度非常快,推荐使用!常用单元格的数据类型empty(空的)numberdatebooleanerrorblank(空白表格)导入模块常用的函数。…

    2022年9月26日
    3
  • Vue大数据可视化(大屏展示)解决方案

    Vue大数据可视化(大屏展示)解决方案一个基于vue、datav、Echart框架的大数据可视化(大屏展示)模板,最近更新了详细的介绍说明,实现大数据可视化。通过vue组件实现数据动态刷新渲染,内部图表可自由替换。部分图表使用DataV自带组件,可自由进行更改,持续更新…项目地址:vue-big-screen(码云)一、项目描述一个基于vue、datav、Echart框架的”数据大屏项目”,通过…

    2022年6月7日
    464
  • java当前时间的时间戳_java获取时间戳和当前时间

    java当前时间的时间戳_java获取时间戳和当前时间java中的时间戳是毫秒为单位,13位;unix的时间戳是秒,10位一、java中获取时间戳//方法一System.currentTimeMillis();//方法二Calendar.getInstance().getTimeInMillis();//方法三newDate().getTime();三种方法性能比较:每种方法运行1亿次importjava.text.SimpleDateFo…

    2022年5月3日
    313
  • jenkins 邮件_邮件发送服务

    jenkins 邮件_邮件发送服务前言前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了。安装EmailExtensionPlugin插件jenkins首页-

    2022年7月29日
    7
  • Java遍历数组逗号的使用[通俗易懂]

    Java遍历数组逗号的使用[通俗易懂]1.错误示例当直接拼接”,”号会在结尾也输出多余的”,”号输出示例2正确示例用判断语句来写当x等于(arr.length的长度-1)满足时,也就是数组arr[4],会在arr[4]后面输出一个”]”号,//(至于为什么不是在arr[4]前面输出”]”,参考java基本结构:顺序结构)当这个条件不满足才会输出”,”号输出示例我是java自学小萌新【闲云】…

    2022年9月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号