• 线程之间的通信socketpair【学习笔记】【原创】


    平台信息:
    内核:linux3.1.0
    系统:android5.0
    平台:tiny4412

    作者:庄泽彬(欢迎转载,请注明作者)

    说明: 韦老师的安卓视频学习笔记

    一、在一个进程中多个线程如何进行通信,主要使用的是socketpair的机制,详细代码如下:

     1 #include <pthread.h>
     2 #include <unistd.h>
     3 #include <stdio.h>
     4 #include <sys/types.h>          /* See NOTES */
     5 #include <sys/socket.h>
     6 
     7 
     8 #define SOCKET_BUFFER_SIZE      (32768U)
     9 #define BUF_MAX_LEN              512
    10 
    11 void *function_thread (void *arg)
    12 {
    13     int fd = (int)arg;
    14     char buf[BUF_MAX_LEN];
    15     int cnt = 0;
    16     int len = -1;
    17     
    18 
    19     while(1)
    20     {
    21         len = sprintf(buf,"Hello,main thread1, cnt = %d
    ",cnt++);
    22         write(fd,buf,len);
    23 
    24         len = read(fd,buf,BUF_MAX_LEN);
    25         buf[len] = '';
    26         printf("thead1 read:%s
    ",buf);
    27 
    28         sleep(5);
    29     }
    30     
    31 
    32     return NULL;
    33 }
    34 
    35 
    36 int main(int argc,char **argv)
    37 {
    38     int ret = -1;
    39     int sockets[2];
    40     int bufferSize = SOCKET_BUFFER_SIZE;
    41     pthread_t threadID;
    42     char buf[BUF_MAX_LEN];
    43     int len = 0;
    44     int cnt = 0;
    45     int fd = -1;
    46 
    47     ret = socketpair(AF_UNIX,SOCK_SEQPACKET,0,sockets);
    48     if(ret){
    49         printf("Error socketpair
    ");
    50         return -1;
    51     }
    52 
    53     setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    54     setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    55     setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    56     setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    57 
    58     ret = pthread_create(&threadID,NULL,function_thread,(void *)sockets[1]);
    59 
    60     fd = sockets[0];
    61 
    62     while(1){
    63         len = read(fd,buf,BUF_MAX_LEN);
    64         buf[len] = '';
    65         printf("Main thread read:%s
    ",buf);
    66 
    67         len = sprintf(buf,"Hello,thread1, cnt = %d
    ",cnt++);
    68         write(fd,buf,len);    
    69     }
    70 
    71     return 0;
    72 }

    编译方法:gcc -o socketpair socketpair.c -lpthread

    二、实验现象:

    三、如下图所示socketpair的进程号为5919,在这个进程下面有两个线程运行。

  • 相关阅读:
    restframwork框架
    restful规范
    python_微信 跳一跳
    项目经历1
    python3.6+GDAL-2.1.3环境配置
    OpenCV&&python_图像平滑(Smoothing Images)
    opencv python3.6安装和测试
    python_机器学习—sklearn_win_64-3.6安装&&测试
    python安装 numpy&安装matplotlib& scipy
    自动出题判分——c#学习实践
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8060357.html
Copyright © 2020-2023  润新知