socketpair通信

1、线程间通信(参考安卓源码InputTransport.cpp)

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


static const size_t SOCKET_BUFFER_SIZE = 32 * 1024;

void *pthread_1(void *arg)
{
    int fd = *((int *)arg);
    char buf[512];
    int len;
    int cnt = 0;
    
    while (1) {
        len = sprintf(buf, "hello, main pthread, cnt = %d", cnt++);
        write(fd, buf, len);

        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];
    pthread_t thread_id;
    if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) {
        printf("socketpair error\n");
        return -1;
    }
    int bufferSize = SOCKET_BUFFER_SIZE;
/* 创建4个buff, sockets[0]的发送buff和接收buff; sockets[1]的发送buff和接收buff*/ 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)); int res = pthread_create(&thread_id, NULL, pthread_1, (void *)(&sockets[1])); if (res) { printf("pthread_create error\n"); return -1; } int fd = sockets[0]; char buf[512]; int len; int cnt = 0; while (1) { len = sprintf(buf, "hello, pthread1, cnt = %d", cnt++); write(fd, buf, len); //将buf中的内容通过fd句柄发送到snd buff len = read(fd, buf, 500); //通过读fd中的rcv buff, 将内容读到buf中,然后打印出来 buf[len] = '\0'; printf("%s\n", buf); sleep(5); } return 0; }

打印信息:

再打开一个终端查看进程:ps  -A 查看socketpair的pid为6065

cd /proc/6065

ls task

2、父子进程间通信

 需要注意的是fd == 0是子进程,fd > 0 是父进程

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

static const size_t SOCKET_BUFFER_SIZE = 32 * 1024;

int main(int argc, char **argv)
{
    int sockets[2];
    if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) {
        printf("socketpair error\n");
        return -1;
    }
    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));
     pid_t fd = fork();if (fd == 0) {
        /* 子进程 */
        int fd = sockets[1];
        char buf[512];
        int len;
        int cnt = 0;
        while (1) {
                len = sprintf(buf, "hello, father pid, cnt = %d", cnt++);
                write(fd, buf, len);

                len = read(fd, buf, 500);
                buf[len] = '\0';
                printf("%s\n", buf);
                sleep(5);
        }
     }
     if (fd > 0) {
        /* 父进程 */
         int fd = sockets[0];
        char buf[512];
        int len;
        int cnt = 0;
        while (1) {
                len = sprintf(buf, "hello, child pid, cnt = %d", cnt++);
                write(fd, buf, len);

                len = read(fd, buf, 500);
                buf[len] = '\0';
                printf("%s\n", buf);
                sleep(5);
        }
       
     }

     return 0;
}

运行结果:

查看进程:ps -A   有2个名为fork的进程

猜你喜欢

转载自www.cnblogs.com/zhu-g5may/p/10555238.html
今日推荐