在C语言中,socketpair 函数的原型通常是:

#include <sys/types.h>
#include <sys/socket.h>


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

其中:


  • domain 参数指定了地址族(address family),通常为 AF_UNIX,表示使用 UNIX 域套接字。

  • type 参数指定了套接字的类型,通常为 SOCK_STREAM(字节流套接字)或 SOCK_DGRAM(数据报套接字)。

  • protocol 参数指定了具体的协议,通常为 0,表示使用默认协议。

  • sv 参数是一个用于存储创建的套接字描述符的数组。在成功时,sv[0] 和 sv[1] 分别是这对相互连接的套接字的描述符。


下面是一个简单的例子,演示了如何使用 socketpair 在父子进程之间传递数据:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>


int main() {
    int sv[2];


    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
        perror("socketpair");
        return 1;
    }


    pid_t pid = fork();


    if (pid == -1) {
        perror("fork");
        return 1;
    }


    if (pid == 0) { // Child process
        close(sv[0]);  // Close the parent side of the socket


        const char *message = "Hello from the child!";
        write(sv[1], message, strlen(message));


        close(sv[1]);
    } else { // Parent process
        close(sv[1]);  // Close the child side of the socket


        char buffer[100];
        ssize_t bytesRead = read(sv[0], buffer, sizeof(buffer));


        if (bytesRead == -1) {
            perror("read");
            return 1;
        }


        buffer[bytesRead] = '\0';
        printf("Received from child: %s\n", buffer);


        close(sv[0]);
    }


    return 0;
}