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)
上一篇 2022年10月14日 下午12:46
下一篇 2022年10月14日 下午12:46


相关推荐

  • 浅谈VGGNet

    浅谈VGGNet1 VGGNet 架构 VGG16 1 输入 224x224x3 的图片 经 64 个 3×3 的卷积核作两次卷积 ReLU 卷积后的尺寸变为 224x224x642 作 maxpooling 最大化池化 池化单元尺寸为 2×2 效果为图像尺寸减半 池化后的尺寸变为 112x112x643 经 128 个 3×3 的卷积核作两次卷积 ReLU 尺寸变为 112x112x1284 作 2×2 的 maxpooling

    2026年3月26日
    2
  • Vue CLI4.0 webpack配置属性——publicPath

    Vue CLI4.0 webpack配置属性——publicPathpublicPathTy stringDefaul 官方文档说明 部署应用包时的基本 URL 用法和 webpack 本身的 output publicPath 一致 但是 VueCLI 在一些其他地方也需要用到这个值 所以请始终使用 publicPath 而不要直接修改 webpack 的 output publicPath 默认情况下 VueCLI 会假设你

    2026年3月11日
    3
  • SP网站建立后.有两处地方需要首先修改

    SP网站建立后.有两处地方需要首先修改1.SP管理中心—-系统设置—-配置备用访问映射内部URL区域区域的公用URL http://kms:504 默认http://kms:504 http://localhost:504 Intranethttp://localhost:504 http://192.168.1.109:504 Internethttp://192.168.1.109:5

    2022年6月17日
    33
  • 达梦数据库创建表空间

    达梦数据库创建表空间达梦数据库的数据是存储在表空间下的 创建表空间时需要指定表空间名和拥有的数据文件列表 通过图形化界面在一个表空间下可以添加多个 dbf 文件 其实 通过命令方式也可以创建一个表空间拥有多个 dbf 文件 比如创建名为 bookshop 的表空间 要求有 2 个数据文件 每个数据文件大小为 128M 命令如下 CREATETABLES dm7 data DA

    2026年3月18日
    2
  • linux的vi命令详解,linux vi命令详解

    linux的vi命令详解,linux vi命令详解linux 下使用 vi 编辑是很方便的 但是具体要怎么做呢 下面由学习啦小编为大家整理了 linux 下 vi 的相关命令 希望对大家有帮助 1 linuxvi 命令的基本观点基本上 vi 能够分为三种形态 区分是命令方式 commandmode 插入方式 Insertmode 和底行方式 lastlinemode 各方式的功用区分如下 1 命令行方式 commandmode 控制屏幕光标的移动 字

    2026年3月18日
    2
  • 保姆级喂饭教程:什么是 Skills?如何用 Skills?

    保姆级喂饭教程:什么是 Skills?如何用 Skills?

    2026年3月12日
    1

发表回复

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

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