通过socketpair+select实现线程同步的用法代码

1,socketpair详细用法说明

socketpair()是一个Unix/Linux系统调用,用于创建一个本地端对(socket pair)。它创建两个已连接的socket描述符,用于在同一进程中的两个不同线程之间进行通信。

以下是socketpair()函数的详细用法说明:

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

参数说明:

domain:指定要使用的协议域,通常是AF_UNIX或AF_INET。
type:指定要创建的套接字的类型,可以是SOCK_STREAM(流套接字)或SOCK_DGRAM(数据报套接字)。
protocol:指定要使用的具体协议,对于大多数应用程序来说,通常设置为0。
sv:这是一个长度为2的整数数组,用于存储创建的两个套接字的描述符。

返回值:

如果成功,socketpair()返回0,否则返回-1并设置errno表示错误码。

2,select的用法说明

Select则是一种用于监视多个文件描述符(包括套接字)的变化情况的方法。它通常用于非阻塞式I/O操作,可以同时监视多个文件描述符的状态(如可读、可写或异常等)。Select通常用于异步或事件驱动的程序中,可以提高程序的效率和响应速度。

在使用Select时,需要创建一个select()函数,指定要监视的文件描述符集合以及等待的时间。在select()函数返回后,可以根据文件描述符的状态进行相应的读写操作。Select的使用需要结合事件循环和回调函数等机制来实现异步I/O操作。

需要注意的是,Socketpair和Select的使用场景和目的不同,应该根据具体的需求选择合适的工具。同时,在使用Socketpair和Select时,需要注意它们的错误处理和异常情况的处理,以确保程序的稳定性和可靠性。

3,使用socketpair和select实现线程同步

下面是一个使用socketpair和select实现两个线程同步的参考代码:

#include <stdio.h>  
#include <stdlib.h>  
#include <sys/socket.h>  
#include <unistd.h>  
#include <string.h>  
#include <pthread.h>  
#include <sys/select.h>  
#include <sys/time.h>  #define BUFFER_SIZE 1024  void *thread_func(void *arg) {  int sockfd = *((int *)arg);  char buffer[BUFFER_SIZE];  fd_set readfds;  struct timeval tv;  int n;  char message[] = "Hello from sub thread";  while (1) {  FD_ZERO(&readfds);  FD_SET(sockfd, &readfds);  tv.tv_sec = 1;  // 设置超时时间为1秒  tv.tv_usec = 0;  n = select(sockfd + 1, &readfds, NULL, NULL, &tv);  if (n == -1) {  perror("select");  exit(EXIT_FAILURE);  } else if (FD_ISSET(sockfd, &readfds)) {  n = recv(sockfd, buffer, BUFFER_SIZE, 0);  buffer[n] = '\0';  printf("Thread received: %s\n", buffer);  } else {  printf("Timeout\n");  break;  }  send(sockfd, message, strlen(message), 0);  }  close(sockfd);  return NULL;  
}  int main() {  int sockfd[2];  pthread_t thread;  char message[] = "Hello from main thread";  // 创建socketpair  if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd) == -1) {  perror("socketpair");  exit(EXIT_FAILURE);  }  // 创建线程并传递socket的文件描述符  if (pthread_create(&thread, NULL, thread_func, &sockfd[0]) != 0) {  perror("pthread_create");  exit(EXIT_FAILURE);  }  // 发送消息给线程,并等待接收消息的超时时间设置为1秒  send(sockfd[1], message, strlen(message), 0);  struct timeval tv;  tv.tv_sec = 1;  // 设置超时时间为1秒  tv.tv_usec = 0;  fd_set readfds;  int n;  while (1) {  FD_ZERO(&readfds);  FD_SET(sockfd[1], &readfds);  n = select(sockfd[1] + 1, &readfds, NULL, NULL, &tv);  if (n == -1) {  perror("select");  exit(EXIT_FAILURE);  } else if (FD_ISSET(sockfd[1], &readfds)) {  n = recv(sockfd[1], buffer, BUFFER_SIZE, 0);  buffer[n] = '\0';  printf("Main received: %s\n", buffer);  break;  // 接收消息,跳出循环等待线程发送消息或超时后退出线程处理函数。  } else {  printf("Timeout\n");  // 超时后输出提示信息。可以根据需求进行其他处理。例如,可以设置一个标志位表示超时,在主线程中检查该标志位并做出相应处理。同时,也可以在超时后直接退出线程处理函数。根据具体需求进行选择。这里简单输出提示信息。}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞天使-linux操作的一些技巧与知识点6-ansible结合jinja2使用,可规范化进行自动化管控

文章目录 在议playbook虚拟环境中安装ansibleplaybook 结合变量的一些演示普通的vars_files 变量&#xff0c;在同级目录创建目录使用host_vars 定义变量group_vars定义变量根据不同系统操作不同版本传递多个外置变量举例几个不同的示例factswhenloophandlers 与 notifytags 任…

个人养老金知多少?

个人养老金政策你了解吗&#xff1f;税优政策你知道吗&#xff1f;你会计算能退多少税吗&#xff1f;… 点这里看一看

橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒&#xff0c;沙盒技术顾名思义就是像一个集装箱一样&#xff0c;把应用(服务&#xff0c;进程之类的)装起来的技术&#xff0c;这样每个进程在自己的沙盒中和其他的沙盒隔离开来&#xff0c;每个沙盒之间存在一个边界使得他们互不干扰&#xff0…

NFTScan 获得比特丛林 (BitJungle) 公司战略投资

近日&#xff0c;NFT 数据基础设施服务商 NFTScan 获得知名区块链安全公司比特丛林 (BitJungle) 战略投资。未来&#xff0c;双方将在链上数据和区块链安全领域展开战略合作&#xff0c;高效联动&#xff0c;让区块链大数据发挥更大价值。 关于 BitJungle 比特丛林 (BitJungle…

删除指定文件夹下的所有文件

要删除指定文件所在的文件夹下的所有文件&#xff08;不包括文件夹本身&#xff09;&#xff0c;你可以使用Python的os模块和os.path模块。下面是一个示例代码&#xff0c;演示如何删除文件夹下的所有文件&#xff0c;但保留文件夹本身&#xff1a; import osdef delete_files…

鸿鹄云商:Java商城引领商业模式的潮流,免费搭建多种商城模式

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用…

idea插件开发报错: ZipException opening “slf4j.jar“: zip END header not found

错误信息 E:\idea-workspace\#idea-plugin\JSON2Object\src\main\java\com\hgy\plugin\json2object\GenerateAction.java:1: 错误: 无法访问com.hgy.plugin.json2object package com.hgy.plugin.json2object; ^ZipException opening "slf4j.jar": zip END header no…

在 Python 中,assert 是一个断言语句

在 Python 中&#xff0c;assert 是一个断言语句&#xff0c;用于测试代码中的条件是否为真。它的语法如下&#xff1a; assert condition, message其中&#xff0c;condition 是要测试的条件&#xff0c;如果条件为真&#xff08;True&#xff09;&#xff0c;则程序继续执行…

湖南开放大学形成性考核 平时作业 参考试题

试卷代号&#xff1a;1292 企业集团财务管理 参考试题&#xff08;开卷&#xff09; 一、单项选择题&#xff08;将正确答案的字母序号填入括号内。每小题2分&#xff0c;共20分&#xff09; 1.当投资企业拥有被投资企业有表决权的资本比例超过50%以上时&#xff0c;母公司…

MyBatisPlus常用注解

TableName 描述&#xff1a;表名注解&#xff0c;标识实体类对应的表 使用位置&#xff1a;实体类 MyBatis-Plus在确定操作的表时&#xff0c;由BaseMapper的泛型决定&#xff0c;即实体类型决定&#xff0c;且默认操作的表名和实体类型的类名一致。 此时可通过TableName注解直…

用23种设计模式打造一个cocos creator的游戏框架----(十六)亨元模式

1、模式标准 模式名称&#xff1a;亨元模式 模式分类&#xff1a;结构型 模式意图&#xff1a;运用共享技术有效地支持大量细粒度的对象 结构图&#xff1a; 适用于&#xff1a; 1、一个应用程序使用了大量的对象. 2、完全由于使用大量的对象&#xff0c;造成很大的存储开…

铭飞CMS list 接口 SQL注入漏洞复现

0x01 产品简介 铭飞CMS是一款基于java开发的一套轻量级开源内容管理系统,铭飞CMS简洁、安全、开源、免费,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,专注为公司企业、个人站长快速建站提供解决方案 0x02 漏洞概述 铭飞CMS在5.2.10版本以前list 接口处存在sql注入…

什么是CAS(比较并交换-乐观锁机制-锁自旋)

什么是 CAS&#xff08;比较并交换-乐观锁机制-锁自旋&#xff09; 概念及特性 CAS&#xff08;Compare And Swap/Set&#xff09;比较并交换&#xff0c;CAS 算法的过程是这样&#xff1a;它包含 3 个参数CAS(V,E,N)。V 表示要更新的变量(内存值)&#xff0c;E 表示预期值(旧…

嵌入式开发板qt gdb调试

1&#xff09; 启动 gdbserver ssh 或者 telnet 登陆扬创平板 192.168.0.253&#xff0c; 进入命令行执行如下&#xff1a; chmod 777 /home/HelloWorld &#xff08;2&#xff09; 打 开 QTcreator->Debug->StartDebugging->Attach to Running Debug Server 进行…

Nginx-nginx-1.18.0编译时默认包含哪些模块?nginx-1.18.0有哪些模块和配置语句,各有什么作用?

目录 01-如何查看 Nginx-nginx-1.18.0编译时默认包含哪些模块&#xff1f;02-如何查看Nginx有哪些自己可以手动设置添加或不添加的模块03-各配置语句和模块功能简介03-001&#xff1a;--pid-pathPATH03-002&#xff1a;--lock-pathPATH 03-003&#xff1a;select_module 03-004…

利息的来源与本质是什么,股市跌的钱去哪里了

目录 利息的来源与本质是什么 股市跌的钱去哪里了 利息的来源与本质是什么 利息的来源是资金所有者由于借出资金而取得的报酬,它来自生产者使用该笔资金发挥营运职能而形成的利润的一部分。这样看来,没有借贷便没有利息。 利息的本质是指货币持有者因贷出货币或货币资本而…

[湖湘杯 2021 final]MultistaeAgency

题目是给了源码&#xff0c;我们先来看web的main.go package mainimport ("bytes""crypto/md5""encoding/json""fmt""io""io/ioutil""log""math/rand""net/http""os"&q…

Python全局变量示例用法

Python全局变量示例用法&#xff1a;在函数体内定义全局变量。即使用global 关键字对变量进行修饰后&#xff0c;该变量就会变为全局变量。 # Author : 小红牛 # 微信公众号&#xff1a;WdPython # 定义全局变量 x 10 y 20print(1.在函数外&#xff0c;打印全局变量xy的值.c…

工作之踩坑记录

1.i386架构之atol函数使用导致的业务程序错误&#xff1a; 情景:将框架传递的链接地址采用整形保存传输,在i386架构上导致地址比较大&#xff0c;采用atol转型可能导致数据被截断出现异常。 方案:采用atoll更大的数据类型进行处理即可避免该问题。 2.Json库使用注意long int问…

汽车IVI中控开发入门及进阶(十二):V4L2视频

前言 汽车中控也被称为车机、车载多媒体、车载娱乐等,其中音频视频是非常重要的部分,比如播放各种格式的音乐文件、播放蓝牙接口的音乐、播放U盘或TF卡中的音视频文件,看起来很简单。如果说音频来源于振动,那么图片图像就是光反射的一种表象。模拟信号表示在空间上是连续…