socketpair是linux提供的一种双向通讯机制,它通过socket实现双向通讯。socketpair本身虽然实现了双向通讯的功能,但是也存在一些限制:比如只能在一个进程的线程之间进行双向通讯或者是在具有亲缘关系的进程间进行通讯。所以socketpair很少情况下会单独使用,它往往需要和其他编程机制结合起来使用才能发挥它真正的作用。本文举两个小例子来说明一下socketpair的基本用法。

一、在一个进程的线程间实现双向通讯

这个例子实现的功能是:编写一个具有两个线程的应用程序,让主线程和子线程通过socketpair进行双向通讯。完整的代码实现如下:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>/* 定义socketpair缓冲区的大小 */
#define SOCKET_BUFFER_SIZE      ((32) * (1024))#define BUFFER_SIZE      (256)   // 定义一个缓冲区的大小/**    定义子线程的主体函数*/
static void *thread_run_func (void *arg)
{int thread_fd = (int)arg;char thread_buf[BUFFER_SIZE] = {0};int readlen;/* a、向主进程发送一个消息 */printf("(1) send to main thread : %s\n", "Hello,world!");write(thread_fd, "Hello,world!", sizeof("Hello,world!"));/* d、接收主进程发送的消息 */readlen = read(thread_fd, thread_buf, BUFFER_SIZE);thread_buf[readlen] = '\0';printf("(4) recv from main thread : %s\n", thread_buf);
}/* *   定义一个子线程,实现两个进程间的双向通讯*/
int main(int argc, char *argv[])
{int sockets[2];int result;int bufferSize;pthread_t thread;char main_buf[BUFFER_SIZE]= {0};int readlen;/* 创建一个socketpair双向通讯的实例 */result = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);if(-1 == result){printf("socketpair error!\n");return -1;}/* 设置socketpair双向通讯各个缓冲区 */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));/* 创建一个子线程用于和主线程之间进行双向通讯 */result = pthread_create(&thread, NULL, thread_run_func, (void *)sockets[1]);sleep(1);    /* 延时一段时间让子进程先于主进程运行 *//* b、接收子进程发送过来的消息 */readlen = read(sockets[0], main_buf, BUFFER_SIZE);main_buf[readlen] = '\0';printf("(2) recv from child thread : %s\n", main_buf);/* c、发送一个消息给子进程 */printf("(3) send to child thread : %s\n", "TECH-PRO");write(sockets[0], "TECH-PRO", sizeof("TECH-PRO"));sleep(1);   /* 延时一段等待子进程执行完毕 */return 0;
}

编译并运行,结果如下:


二、在父子进程间实现双向通讯

这个例子实现的功能是:编写一个应用程序,实现两个进程,让这两个进程之间实现双向通讯。完整代码如下所示:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>/* 定义socketpair缓冲区的大小 */
#define SOCKET_BUFFER_SIZE      ((32) * (1024))#define BUFFER_SIZE      (256)   // 定义一个缓冲区的大小/* *   定义一个子线程,实现两个进程间的双向通讯*/
int main(int argc, char *argv[])
{int sockets[2];int result;int bufferSize;pthread_t thread;char buf[BUFFER_SIZE]= {0};int readlen;int father_fd;int child_fd;/* 创建一个socketpair双向通讯的实例 */result = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);if(-1 == result){printf("socketpair error!\n");return -1;}/* 设置socketpair双向通讯各个缓冲区 */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));father_fd = sockets[0];child_fd = sockets[1];/* 创建子进程 */result = fork();if(-1 == result){printf("fork error!\n");return -1;}else if(0 == result)  // 子进程{/* a、向主进程发送一个消息 */printf("(1) send to main thread : %s\n", "Hello,world!");write(child_fd, "Hello,world!", sizeof("Hello,world!"));/* d、接收主进程发送的消息 */readlen = read(child_fd, buf, BUFFER_SIZE);buf[readlen] = '\0';printf("(4) recv from main thread : %s\n", buf);}else if(result > 0)        // 父进程{sleep(1);    /* 延时一段时间让子进程先于主进程运行 *//* b、接收子进程发送过来的消息 */readlen = read(father_fd, buf, BUFFER_SIZE);buf[readlen] = '\0';printf("(2) recv from child thread : %s\n", buf);/* c、发送一个消息给子进程 */printf("(3) send to child thread : %s\n", "TECH-PRO");write(father_fd, "TECH-PRO", sizeof("TECH-PRO"));sleep(1);    /* 延时一段等待子进程执行完毕 */}return 0;
}

编译并运行,结果如下所示:

至此,两个简单的socketpair的小例子实现完毕。本人能力有限,文中有错误或者不合理的地方,请多指教。

linux编程基础:使用socketpair实现双向通讯相关推荐

  1. linux编程取消wait函数,Linux编程基础之进程等待(wait()函数).pdf

    Linux编程基础之进程等待(wait()函数) 编程过程中,有时需要让一个进程等待另一个进程 ,最常见的是父进程等待自己的子进程 ,或者父进程回收自己 的子进程资源包括僵尸进程.这里简单介绍一下系统 ...

  2. Linux编程基础:第5章Linux文件系统与操作 课后习题

    <Linux编程基础>黑马程序员/编著 清华大学出版社 目录 一.填空题 二.判断题 三.单选题 四.简答题 1.简单说明软链接文件和硬链接文件的区别. 2.已知inode结构体中的共有1 ...

  3. Linux编程基础之lseek函数返回值

    目录 前言 lseek函数返回值 实操证明 书的原图 总结 前言 操作系统:Fedora 头文件 <sys/types.h> , <unistd.h> lseek函数返回值 o ...

  4. Linux编程基础:第1章初识Linux 课后习题

    <Linux编程基础>黑马程序员/编著 清华大学出版社 目录 一.填空题 二.判断题 三.单选题 四.简答题 1.简单叙述Linux操作系统的特点. 2.陈述ifconfig命令和ping ...

  5. Linux编程基础:第4章Shell编程 课后习题

    <Linux编程基础>黑马程序员/编著 清华大学出版社 目录 一.填空题 二.判断题 三.单选题 四.简答题 1.分析以下脚本代码: 2.写出shell脚本中while循环与until循环 ...

  6. Linux编程基础:第2章命令与开发工具 课后习题

    <Linux编程基础>黑马程序员/编著 清华大学出版社 目录 一.填空题 二.判断题 三.单选题 四.简答题 1.简单说明Vi编辑器的工作模式,并画图说明各模式间的切换方法. 2.简述GC ...

  7. linux编程基础_第1篇 Linux系统编程 -多线程基础

    进程 在理解线程之前,首先需要了解UNIX/Linux进程. 进程是由操作系统创建的,需要相当数量的"开销". 进程包含有关程序资源和程序执行状态的信息,包括:它是一个在随机访问内 ...

  8. 嵌入式Linux编程基础ppt,嵌入式LinuxC高级编程.ppt

    <嵌入式LinuxC高级编程.ppt>由会员分享,可在线阅读,更多相关<嵌入式LinuxC高级编程.ppt(45页珍藏版)>请在装配图网上搜索. 1.嵌入式Linux C高级编 ...

  9. Linux编程基础:第一章初识Linux课后习题及自我总结

    一.填空题 1.Linux操作系统的核心程序由芬兰赫尔辛基大学的一名学生(Linus Torvalds(林纳斯·托瓦兹))编写. [自我总结]Linux,全称GNU/Linux,是一种免费使用和自由传 ...

最新文章

  1. windows下安装nodejs、webpack及打包步骤
  2. maven2学习总结(1,入门起步与实践)
  3. SQL大数据查询优化
  4. Django(补充CBV,FBV)
  5. vs2013和mysql连接_安装VS2013后与数据库的连接问题
  6. eclipse打包jar发布到linux下运行出错(java.lang.ClassNotFoundException: cmd.WordCount$MyMapper )
  7. Qt::Window 独立窗口
  8. 万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)
  9. TensorFlow简介:向量对象
  10. iosApp上传app遇到的问题
  11. 论卢伟冰加入小米公司后的变化
  12. matlab中 点到线的距离,点到空间直线的距离 | 学步园
  13. 指纹识别技术未来发展趋势
  14. 渗透测试工具篇——sqlmap
  15. mysql group concat 去重,MySQL group_concat() 函数用法
  16. python象棋游戏代码_python学员作品-象棋游戏
  17. Origin2018怎么画出向上向下的柱状图
  18. 《GHOSTXP-SP2电脑公司特别版8.0》完美增强版
  19. 网页右下角弹出广告窗口 超简洁
  20. 极值理论(三):POT模型

热门文章

  1. 三鹿奶粉的问题不简单
  2. 中科大-2021年-研究生基因组学复习资料
  3. 创建ClickOnce清单签名.pfx格式数字证书
  4. .NET平台开源项目速览(20)Newlife.Core中简单灵活的配置文件
  5. 决策树案例以及决策树可视化
  6. 超详细用Python进行信用评分卡建模【kaggle的give me some credit数据集】【风控建模】
  7. js slice 假分页
  8. md5加密 原理 js 前后端使用
  9. 冰汽时代机器人不用热_冰汽时代机器人效率怎么样 机器人与工人产出效率对比...
  10. linux服务器中JDK的安装和配置