socketpair函数介绍及使用

  • 函数原型
  • 进程间通信
  • 线程间通信

  Linux环境下使用socketpair函数创造一对未命名的、相互连接的UNIX域套接字。
  管道历史上,它们是半双工的(数据只能在一个方向上流动),但是现在也有全双工管道。管道只能在具有共同祖先的两个进程之间使用,通常一个管道由一个进程创建,在进程调用fork之后,这个管道就你能在父进程和子进程之间使用了。

函数原型

#include <sys/types.h>
#include <sys/socket.h>
//socketpair函数
int socketpair(int domain, int type, int protocol, int sv[2]);

参数1(domain):表示协议族,在Linux下只能为AF_LOCAL或者AF_UNIX。(自从Linux 2.6.27后也支持SOCK_NONBLOCK和SOCK_CLOEXEC)
参数2(type):表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。SOCK_STREAM是基于TCP的,而SOCK_DGRAM是基于UDP的
参数3(protocol):表示类型,只能为0
参数4(sv[2]):套节字柄对,该两个句柄作用相同,均能进行读写双向操作
返回结果: 0为创建成功,-1为创建失败,并且errno来表明特定的错误号,具体错误号如下所述:

EAFNOSUPPORT:本机上不支持指定的address。
EFAULT: 地址sv无法指向有效的进程地址空间内。
EMFILE: 已经达到了系统限制文件描述符,或者该进程使用过量的描述符。
EOPNOTSUPP:指定的协议不支持创建套接字对。
EPROTONOSUPPORT:本机不支持指定的协议。

进程间通信

/*socketpair1.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>int main ()
{int sv[2];int result = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);if (result < 0){exit(1);}printf("sv[0] is : %d \n", sv[0]);   //这两个套节字句柄并不相同,但作用是一样的printf("sv[1] is : %d \n", sv[1]);if (fork()){ /* 父进程 */int val = 0;pid_t pid = getpid(); close(sv[1]);    //父进程关闭sv[1]的读写权限while (1){          ++val;printf("%d send message: %d\n", pid, val);   write(sv[0], &val, sizeof(val));            //父进程向管道里写数据// read(sv[0], &val, sizeof(val));          //如果字进程不写数据,将会导致此处堵塞//printf("%d receive message: %d\n", pid, val);sleep(1);}}else{  /*子进程*/int val = 0;close(sv[0]); //字进程关闭sv[0]的读写权限pid_t pid = getpid(); while(1){read(sv[1], &val, sizeof(val));            //字进程从管道中取数据printf("%d receive message: %d\n", pid, val);//  printf("%d receive message: %d\n", pid, val); //  write(sv[1], &val, sizeof(val));}}
}

运行结果:

线程间通信

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>static void *thread_run_func (void *arg)
{int thread_fd = (int)arg;char thread_buf[50] = {0};int readlen;/* 向主进程发送一个消息 */printf("send to main thread : %s\n", "Hello,main!");write(thread_fd, "Hello,main!", sizeof("Hello,main!"));/* 接收主进程发送的消息 */readlen = read(thread_fd, thread_buf, 50);thread_buf[readlen] = '\0';printf("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[50]= {0};int readlen;result = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);if(-1 == result){printf("socketpair error!\n");return -1;}/* 创建一个子线程用于和主线程之间进行双向通讯 */result = pthread_create(&thread, NULL, thread_run_func, (void *)sockets[1]);sleep(1);    /* 延时一段时间让子进程先于主进程运行 *//* 接收子进程发送过来的消息 */readlen = read(sockets[0], main_buf, 50);main_buf[readlen] = '\0';printf("recv from child thread : %s\n", main_buf);/* 发送一个消息给子进程 */printf("send to child thread : %s\n", "Hi,child");write(sockets[0], "Hi,child", sizeof("Hi,child"));sleep(1);return 0;
}

运行结果:

【socketpair函数介绍及使用】相关推荐

  1. socketpair函数介绍及使用

    摘要 在linux下,使用socketpair函数能够创建一对套节字进行进程间通信(IPC). 函数原形: #include <sys/types.h> #include <sys/ ...

  2. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  3. C语言中的scanf()函数介绍

    1.scanf函数:读取从键盘输入的数据 在C语言中,有多个函数可以从键盘获得用户输入: scanf():和 printf() 类似,scanf() 可以输入多种类型的数据 getchar().get ...

  4. 延时函数介绍和呼吸灯的实现

    文章目录 延时函数介绍 呼吸灯原理 杨桃32学习笔记,本文图片文字皆为转述 延时函数介绍 分为delay_s秒,delay_ms毫秒,delay_us微秒延时,最大参数不能超过65535. 呼吸灯原理 ...

  5. ×××S 2012 参照函数 -- 介绍

    ×××S 2012 参照函数 -- 介绍 在×××S中,一张报表内可以同时包含多个数据集,但是一个数据区域就仅限于一个数据集,如果希望同时参考多个数据集,查找函数就能轻松办到,其概念类似JOIN是通过 ...

  6. 【 MATLAB 】rem 函数介绍

    rem函数和mod函数很相似,二者认真看一个,另一个看一下区别即可. mod函数介绍:[ MATLAB ]mod 函数介绍 rem Remainder after division Syntax r ...

  7. 【 MATLAB 】filter 函数介绍 之 Filter Data in Sections

    [ MATLAB ]filter 函数介绍(一维数字滤波器) 在上篇博文中,里面有一个例子,就是过滤部分中的数据,这个部分中的数据的意思是如果有一个向量需要过滤,我们可以把它分为几段,然后分段过滤. ...

  8. swift1.2语言函数和闭包函数介绍

    swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...

  9. php函数介绍,PHP函数介绍_PHP教程

    PHP函数介绍 基本使用: 函数定义形式: function 函数名(形参1,形参2,...) { //函数体(代码块): } 函数调用形式: 本质上就是使用一个名字来达到执行其中函数中的的作用.通常 ...

最新文章

  1. pku2229--sumsets(zjgsu,分花)
  2. java web压缩过滤器_Java Web过滤器Filter(五)
  3. base64核心原理
  4. Repeater 中TextBox 触发TextChanged事件
  5. ROS + OpenCV
  6. 高低层特征融合【转载】
  7. 【Flink】Flink 的输出 Output CountingOutput
  8. 软件LoadRunner 产品信息(product information)
  9. 重命名Windows内置Administrator帐户的方法
  10. perl 调用 shell 文件 防止出问题,最好写绝对路径
  11. Ubuntu已经很好用了
  12. 我在公司内部的分享(秒针系统)
  13. Struts2 初探
  14. linux脚本批量解压,Shell中使用tar命令批量解压缩的实现方法
  15. 小球碰撞python代码_Java 实现小球碰撞GUI
  16. C# winform 选择文件保存路径
  17. 百度云apkg手机文件怎么打开_ipad上用百度云和notability学习时的各种七七八八
  18. 头歌—练习-Java循环综合练习四之日历打印
  19. vue ant design a-table表格标题(title)添加icon样式
  20. Android开发笔记(序)

热门文章

  1. CoCosCreator2.2.1 入门教程
  2. 上榜 越秀国际金融汇获选第十届“广厦奖”候选项目
  3. LeetCode 952. 按公因数计算最大组件大小
  4. 自然语言处理(NLP)之word2vec的实现(PTB语料库)<找语义相近的词>
  5. 网络安全课程day1
  6. oracle数据库管理员培训
  7. C#桌面应用程序--定时器
  8. 模型评估 | 机器学习回归模型评价(RMSE、MAE、MAPE)
  9. CSS 边框 阴影 效果
  10. 头条显示服务器升级中,今日头条宣布生态升级:多元手段服务优质创作者