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

news/2024/12/29 18:53:11/

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.ppmy.cn/news/1269527.html

相关文章

Qt设置类似于qq登录页面(ikun)

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QWindow> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton>QT_BEGIN_NAMESPACE namespace Ui { class…

Ganache结合内网穿透实现远程或不同局域网进行连接访问

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角

本节课的内容&#xff0c;就让我们来学习一下ArrayList集合的应用&#xff0c;ArrayList的本质就是一个顺序表&#xff0c;那下面一起来学习吧 目录 一、杨辉三角 1.题目详情及链接 2.剖析题目 3.思路及代码 二、洗牌算法 1.创造牌对象 2.创造一副牌 3.洗牌操作 4.发…

WPF-UI HandyControl 简单介绍

文章目录 前言我的网易云专栏和Gitee仓库HandyControlHandyControl示例相关资源地址 我的运行环境快速开始和Material Design功能对比手风琴右键菜单自动补充滚动条轮播图消息通知步骤条托盘按钮 结尾 前言 最近我在研究如何使用WPF做一个比较完整的项目&#xff0c;然后我就先…

【问题处理】—— lombok 的 @Data 大小写区分不敏感

问题描述 今天在项目本地编译的时候&#xff0c;发现有个很奇怪的问题&#xff0c;一直提示某位置找不到符号&#xff0c; 但是实际在Idea中显示确实正常的&#xff0c;一开始以为又是IDEA的故障&#xff0c;所以重启了IDEA&#xff0c;并执行了mvn clean然后重新编译。但是问…

【mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar安装】linux安装mysql5.7

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

MSF学习

之前的渗透测试中 其实很少用到 cs msf 但是在实际内网的时候 可以发现 msf cs 都是很好用的 所以现在我来学习一下 msf的使用方法 kali自带msf https://www.cnblogs.com/bmjoker/p/10051014.html 使用 msfconsole 启动即可 首先就是最正常的木马生成 所以这里其实只需…

python自动化测试实战 —— WebDriver API的使用

软件测试专栏 感兴趣可看&#xff1a;软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识&#xff1a; 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…