最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++中socketpair函數(shù)示例詳解

 更新時(shí)間:2025年07月29日 10:37:54   作者:青草地溪水旁  
socketpair()創(chuàng)建已連接的匿名Unix套接字對(duì),用于高效進(jìn)程間通信,無(wú)需綁定或連接,支持雙向流式/數(shù)據(jù)報(bào)通信,適用于父子進(jìn)程和線程,相比管道,提供全雙工能力,結(jié)合了易用性與靈活性,本文給大家介紹c++中socketpair函數(shù)示例,感興趣的朋友一起看看吧

socketpair() 是 Unix/Linux 系統(tǒng)中用于創(chuàng)建一對(duì)相互連接的匿名套接字的系統(tǒng)調(diào)用,專(zhuān)為 進(jìn)程間通信 (IPC) 設(shè)計(jì)。這對(duì)套接字在創(chuàng)建后即處于連接狀態(tài),無(wú)需綁定地址或手動(dòng)連接,特別適用于父子進(jìn)程或線程間通信。

函數(shù)原型

#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
參數(shù)說(shuō)明
domain協(xié)議族:通常為 AF_UNIX(本地通信)或 AF_LOCAL(同義)
type套接字類(lèi)型:SOCK_STREAM(流式)或 SOCK_DGRAM(數(shù)據(jù)報(bào))
protocol協(xié)議:通常為 0(自動(dòng)選擇)
sv[2]用于存儲(chǔ)兩個(gè)套接字描述符的數(shù)組(輸出參數(shù))
返回值成功返回 0,失敗返回 -1 并設(shè)置 errno

核心特性

  1. 匿名連接
    • 套接字對(duì)在創(chuàng)建時(shí)已自動(dòng)連接,無(wú)需調(diào)用 bind(), listen(), accept(), connect()
  2. 雙向通信
    • 兩個(gè)套接字均可讀寫(xiě)(全雙工)。
  3. 高效 IPC
    • 數(shù)據(jù)在內(nèi)核中直接傳遞,無(wú)需經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議棧。
  4. 無(wú)文件路徑
    • 與命名 Unix 套接字不同,不會(huì)在文件系統(tǒng)中創(chuàng)建節(jié)點(diǎn)。

使用場(chǎng)景

  1. 父子進(jìn)程通信
    • 父進(jìn)程創(chuàng)建套接字對(duì) → fork() → 父子進(jìn)程各關(guān)閉一端 → 通過(guò)剩余套接字通信。
  2. 線程間通信
    • 線程可直接通過(guò)套接字描述符交換數(shù)據(jù)。
  3. 替代管道 (pipe)
    • 提供雙向通信能力(管道是單向的)。

使用步驟

  1. 調(diào)用 socketpair() 創(chuàng)建套接字對(duì)
  2. 根據(jù)場(chǎng)景關(guān)閉不需要的描述符
  3. 通過(guò) read()/write()send()/recv() 通信
  4. 通信完成后關(guān)閉所有描述符

示例代碼:父子進(jìn)程通信

#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int sv[2];  // 套接字對(duì)
    pid_t pid;
    char buf[128];
    // 1. 創(chuàng)建流式套接字對(duì)
    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
        perror("socketpair");
        exit(1);
    }
    // 2. 創(chuàng)建子進(jìn)程
    pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(1);
    }
    if (pid == 0) { // 子進(jìn)程
        close(sv[0]);  // 關(guān)閉父進(jìn)程端
        // 3. 向父進(jìn)程發(fā)送消息
        const char *msg = "Hello from child";
        write(sv[1], msg, strlen(msg) + 1);
        // 4. 接收父進(jìn)程回復(fù)
        read(sv[1], buf, sizeof(buf));
        printf("Child received: %s\n", buf);
        close(sv[1]);  // 關(guān)閉子進(jìn)程端
        exit(0);
    } 
    else { // 父進(jìn)程
        close(sv[1]);  // 關(guān)閉子進(jìn)程端
        // 3. 接收子進(jìn)程消息
        read(sv[0], buf, sizeof(buf));
        printf("Parent received: %s\n", buf);
        // 4. 回復(fù)子進(jìn)程
        const char *reply = "Hello from parent";
        write(sv[0], reply, strlen(reply) + 1);
        close(sv[0]);  // 關(guān)閉父進(jìn)程端
        wait(NULL);    // 等待子進(jìn)程退出
    }
    return 0;
}

關(guān)鍵參數(shù)詳解

1.domain協(xié)議族

  • AF_UNIX / AF_LOCAL
    本地通信(進(jìn)程間通信),唯一推薦選項(xiàng)(其他如 AF_INET 通常不支持)。

2.type套接字類(lèi)型

類(lèi)型特性
SOCK_STREAM可靠、雙向、面向連接的字節(jié)流(類(lèi)似 TCP),無(wú)消息邊界
SOCK_DGRAM數(shù)據(jù)報(bào)服務(wù)(類(lèi)似 UDP),保留消息邊界(在 AF_UNIX 中仍可靠)
擴(kuò)展標(biāo)志
SOCK_NONBLOCK非阻塞模式(Linux 特有,如 SOCK_STREAM | SOCK_NONBLOCK
SOCK_CLOEXEC執(zhí)行 exec 時(shí)關(guān)閉描述符(避免泄漏)

3.protocol

  • 固定為 0(系統(tǒng)自動(dòng)選擇協(xié)議)。

與管道的對(duì)比

特性socketpair()pipe()
通信方向雙向(全雙工)單向(半雙工)
數(shù)據(jù)流類(lèi)型流式/數(shù)據(jù)報(bào)字節(jié)流
描述符數(shù)量2 個(gè)(均可讀寫(xiě))2 個(gè)(一個(gè)讀,一個(gè)寫(xiě))
進(jìn)程關(guān)系需繼承描述符(通常用于父子進(jìn)程)同左
控制能力支持非阻塞、信號(hào)驅(qū)動(dòng)等高級(jí)選項(xiàng)功能有限

常見(jiàn)錯(cuò)誤處理

if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
    switch(errno) {
        case EMFILE:  // 進(jìn)程描述符耗盡
            perror("Too many open files");
            break;
        case EAFNOSUPPORT: // 不支持的協(xié)議族
            perror("Unsupported address family");
            break;
        case EPROTONOSUPPORT: // 不支持的協(xié)議
            perror("Unsupported protocol");
            break;
        default:
            perror("socketpair");
    }
    exit(EXIT_FAILURE);
}

注意事項(xiàng)

  1. 描述符關(guān)閉
    • 通信雙方需顯式關(guān)閉未使用的描述符(避免資源泄漏)。
  2. 協(xié)議族限制
    • 可移植代碼應(yīng)僅使用 AF_UNIX(其他協(xié)議族如 AF_INET 可能不被支持)。
  3. 阻塞與非阻塞
    • 默認(rèn)阻塞模式,可通過(guò) fcntl(fd, F_SETFL, O_NONBLOCK)SOCK_NONBLOCK 標(biāo)志設(shè)為非阻塞。
  4. 進(jìn)程關(guān)系
    • 套接字對(duì)只能在有親緣關(guān)系的進(jìn)程間繼承(或通過(guò) sendmsg() 傳遞描述符)。

適用場(chǎng)景對(duì)比

場(chǎng)景推薦方法
父子進(jìn)程雙向通信socketpair()
無(wú)親緣關(guān)系進(jìn)程通信命名 Unix 套接字
簡(jiǎn)單單向數(shù)據(jù)流(如日志)pipe()
高性能 IPC(Linux 特有)eventfd()/signalfd()

socketpair() 是進(jìn)程間雙向通信的輕量級(jí)解決方案,結(jié)合了管道的易用性和套接字的靈活性,尤其適合需要在親緣進(jìn)程間高效傳遞數(shù)據(jù)的場(chǎng)景。

到此這篇關(guān)于c++中socketpair函數(shù)示例詳解的文章就介紹到這了,更多相關(guān)c++ socketpair函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊詳解

    C語(yǔ)言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下
    2022-11-11
  • C語(yǔ)言并查集的非遞歸實(shí)現(xiàn)詳解

    C語(yǔ)言并查集的非遞歸實(shí)現(xiàn)詳解

    以下是對(duì)C語(yǔ)言并查集的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • Qt中QGroupBox控件的實(shí)現(xiàn)

    Qt中QGroupBox控件的實(shí)現(xiàn)

    QGroupBox 是 Qt 框架中一個(gè)非常有用的控件,它主要用于組織和管理一組相關(guān)的控件,本文主要介紹了Qt中QGroupBox控件的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • C語(yǔ)言基于graphics.h實(shí)現(xiàn)圣誕樹(shù)

    C語(yǔ)言基于graphics.h實(shí)現(xiàn)圣誕樹(shù)

    這篇文章主要介紹了圣誕樹(shù)代碼,c語(yǔ)言編程,基于graphics.h實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • matlab實(shí)現(xiàn)繪制玫瑰花球的示例代碼

    matlab實(shí)現(xiàn)繪制玫瑰花球的示例代碼

    這篇文章主要介紹了如何利用matlab實(shí)現(xiàn)繪制玫瑰花球,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2023-08-08
  • windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境

    windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境

    這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Qt利用QSortFilterProxyModel代理實(shí)現(xiàn)自定義排序與聯(lián)合過(guò)濾

    Qt利用QSortFilterProxyModel代理實(shí)現(xiàn)自定義排序與聯(lián)合過(guò)濾

    QsortFilterProxyModel類(lèi)用來(lái)為model和view之間提供強(qiáng)大的排序和過(guò)濾支持。這篇文章將利用QSortFilterProxyModel代理實(shí)現(xiàn)自定義排序與聯(lián)合過(guò)濾,需要的可以參考一下
    2022-11-11
  • C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)

    C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)

    本文主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語(yǔ)言單鏈表實(shí)現(xiàn)方法詳解

    C語(yǔ)言單鏈表實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了C語(yǔ)言單鏈表實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了基于C語(yǔ)言的單鏈表定義、創(chuàng)建、添加、刪除、排序、打印等操作技巧,并附帶了相關(guān)的優(yōu)化算法,需要的朋友可以參考下
    2018-04-04
  • Visual?Studio?2022?安裝低版本?.Net?Framework的圖文教程

    Visual?Studio?2022?安裝低版本?.Net?Framework的圖文教程

    這篇文章主要介紹了Visual?Studio?2022?如何安裝低版本的?.Net?Framework,首先打開(kāi)?Visual?Studio?Installer?可以看到vs2022?只支持安裝4.6及以上的版本,那么該如何安裝4.6以下的版本,下面將詳細(xì)介紹,需要的朋友可以參考下
    2022-09-09

最新評(píng)論

铅山县| 莒南县| 陆丰市| 中山市| 嵩明县| 门源| 沙田区| 丹江口市| 防城港市| 鹤峰县| 宁津县| 嘉善县| 松溪县| 江西省| 固镇县| 个旧市| 南岸区| 桑植县| 泗水县| 扎兰屯市| 井冈山市| 射洪县| 安平县| 仙游县| 科尔| 沙河市| 远安县| 翁源县| 海原县| 保德县| 胶州市| 邯郸市| 荥阳市| 连城县| 莒南县| 江阴市| 盐边县| 淮北市| 开原市| 富裕县| 肃宁县|