linux socketpair 基本用法

前言

linux进程之间有一种通信方式是匿名管道。匿名管道只能用于父子进程之间的通信,且是半双工的。

网络进程之间的通信方式,使用套接字(socket)。socket可以实现跨进程的通信。

socketpair可以实现网络进程之间的通信,也可以实现本地进程和线程之间的通信。本文主要将本地之间的通信方式。

正文

socketpair 可以在父子进程和线程之间进程通信;socketpair能够返回两个文件描述符,都可以进行读写的操作,可以实现全双工通信。

API

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

    • 功能: 创建一对连接sockets
    • 参数:
      • domain :AF_UNIX 用于本地通信
      • type: SOCK_SEQPACKET
      • protocol :通常为0
      • sv[2] :创建的一对文件描述符
  • int setsockopt(int sockfd, int level, int optname,
    void *optval, socklen_t *optlen);

    • 功能: 设置socket。可以用来设置socketpair既能用于结束也能用户发送

    示例

    使用socketpair创建一对文件描述符,在一个文件线程中往s[0]中写数据,在另一个线程中从s[1]中读数据。

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

#define SOCKET_BUFFER_SIZE      (32768U)

void *function_thread1 (void *arg)
{
    int fd = (int)arg;
    char buf[500];
    int len;
    int cnt = 0;

    while (1)
    {
        /* 向 main线程发出: Hello, main thread  */
        len = sprintf(buf, "Hello, main thread, cnt = %d", cnt++);
        write(fd, buf, len);

        /* 读取数据(main线程发回的数据) */
        len = read(fd, buf, 500);
        buf[len] = '\0';
        printf("%s\n", buf);

        sleep(5);
    }

    return NULL;
}

int main(int argc, char **argv)
{
    int sockets[2];

    socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);

    int bufferSize = SOCKET_BUFFER_SIZE;
    setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));

    /* 创建线程1 */
    pthread_t threadID;
    pthread_create(&threadID, NULL, function_thread1, (void *)sockets[1]);
    char buf[500];
    int len;
    int cnt = 0;
    int fd = sockets[0];

    while(1)
    {
        /* 读数据: 线程1发出的数据 */
        len = read(fd, buf, 500);
        buf[len] = '\0';
        printf("%s\n", buf);

        /* main thread向thread1 发出: Hello, thread1 */
        len = sprintf(buf, "Hello, thread1, cnt = %d", cnt++);
        write(fd, buf, len);
    }
}

使用socketpair可以实现,往s[0]中写数据,则就可以从s[1]中进行读数据;反之亦然,能实现相互之间的通信。

总结

使用socketpair能实现父子进程或者线程之间的数据交互。
实例代表:android输入子系统和android adb 的实现中等。

参考文献

Linux的进程间通信 - 管道
Linux Socket编程(不限Linux)
socketpair理解

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值