本篇主要分析模块一中trans_service目录下tcp_socket.c代码。 文件路径(模块一\communication_softbus_lite- master\trans_service\source\utils\message.c)
一、背景知识os_adapter相关前缀理论部分已经在队友博客中解释(点击此处查看理论部分)
二、代码分析软总线模块中os_adapter目录为操作系统接口适配层,其中L0和L1两个目录下各有一个os_adapter.c文件,二者功能函数基本一致,不同点在于适用环境不同,下面主要分析L1下面os_adapter.c文件。 1.初始化互斥锁 mutexinit函数用来初始化互斥锁,基于pthread_mutex_init()函数。
MutexId MutexInit(void)//初始化互斥锁
{
pthread_mutex_t *mutex = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
//使用malloc函数动态申请内存空间
if (mutex == NULL) {
return NULL;
//申请失败函数返回NULL
}
(void)pthread_mutex_init(mutex, NULL);
//该函数用于C函数的多线程编程中,互斥锁的初始化。
return (MutexId)mutex;
}
2.互斥体加锁 MutexLock函数用来为互斥体进行加锁,将参数指定的对象进行加锁,避免被其他进程调用读取。 基于pthread_mutex_lock(),该函数锁住由mutex指定的mutex 对象。如果mutex已经被锁住,调用这个函数的线程阻塞直到mutex可用为止。这跟函数返回的时候参数mutex指定的mutex对象变成锁住状态, 同时该函数的调用线程成为该mutex对象的拥有者。
void MutexLock(MutexId mutex)
{
if (mutex == NULL) {
return;
}
pthread_mutex_lock((pthread_mutex_t *)mutex);
//锁住由mutex指定的mutex 对象。
}
3.互斥体释放 MutexUnLock函数用来释放互斥体指向对象上面的锁,基于pthread_mutex_unlock() 函数。 pthread_mutex_unlock()可释放mutex引用的互斥锁对象。互斥锁的释放方式取决于互斥锁的类型属性。 如果调用pthread_mutex_unlock()时有多个线程被mutex对象阻塞,则互斥锁变为可用时调度策略可确定获取该互斥锁的线程。 对于PTHREAD_MUTEX_RECURSIVE类型的互斥锁,当计数达到零并且调用线程不再对该互斥锁进行任何锁定时,该互斥锁将变为可用。
void MutexUnlock(MutexId mutex)//释放互斥体
{
if (mutex == NULL) {
return;
}
pthread_mutex_unlock((pthread_mutex_t *)mutex);
//释放有参数mutex指定的mutex对象的锁。
}
4.关闭套接字函数
void CloseSocket(int *fd)
{
if (fd == NULL) {
return;
}
if (*fd >= 0) {
close(*fd);
//传入的正值对应的套接字接口关闭
*fd = -1;
}
//关闭socket中套接字连接
}
5.创建消息队列 CreateMsgQue() 函数用来创建一个消息队列。 参数详解
- const char *queueName :队列名
- unsigned short len:每个消息的最大字节数
- unsigned int *queueID:队列的ID编号
- unsigned int flags:消息队列标志,表示是否堵塞
- unsigned short maxMsgSize:消息队列中每个消息的最大字节数
int CreateMsgQue(const char *queueName,//创建一个消息队列
unsigned short len, unsigned int *queueID,
unsigned int flags, unsigned short maxMsgSize)
{
if (queueName == NULL || queueID == NULL) {
return -1;
}
struct mq_attr newAttr = {0};
newAttr.mq_flags = flags;
newAttr.mq_maxmsg = len;
newAttr.mq_msgsize = maxMsgSize;
int mqd = mq_open(queueName, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR, &newAttr);
//mq_open函数用来创建一个消息队列,成功返回队列描述符,失败-1
if (mqd
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?