通过man来查看pthread_create的使用

主要是当作笔记的

告诫自己,不能总是一有问题就去看中文别人的解释,要学会自己查看手册和英文解释,先从查看手册做起!

看见代码里面别人使用了pthread_create:

pthread_create(&p_id, 0, creat_trd_recv, (void *)&HiSerfd);

看了一下这几个参数的定义:

pthread_t p_id;
void *creat_trd_recv(void *param) 

{
    int ret = 0; // 存储接收函数的返回值
    char recvbuf[1024] = {0}; // 接收缓冲区,大小为 1024 字节
    int HiSerfd = *(int *)param; // HiSerfd 是从参数 param 中提取的串口文件描述符
    while (1)
    {
        ret = HI_Serial_Recv(HiSerfd, recvbuf, sizeof(recvbuf));  // 不断调用 HI_Serial_Recv 函数从串口接收数据
        if (ret > 0) // 如果接收到的数据长度大于 0,则打印接收到的数据,并使用 memset 函数清空接收缓冲区
        {
            printf("Recv Data >> %s\n", recvbuf);
            memcpy(recvbuf,0,1024); 
        }
    }
    return NULL;
}

HiSerfd = HI_Serial_Open(HiSerialDev); 
int HI_Serial_Open(char* HiSerDevice)  
{  
    int fd;
	fd = open(HiSerDevice, O_RDWR|O_NOCTTY|O_NDELAY);  // 打开指定的串口设备HiSerDevie,O_RDWR:读写,O_NOCTTY:不将该设备分配为该进程的控制终端,O_NDELAY:不关心DCD信号线的状态,如果没有检测到载波(carrier),也不会阻塞
	if (HI_FALSE == fd)  // 检查是否打开成功
	{  
		perror("HiSerial Can't Open Serial HiSerDevice");  
		return(HI_FALSE);  
	}  
	//恢复串口为阻塞状态(阻塞指的当进程在读写文件时,如果没有数据可读或可写,进程会一直等待,直到有数据可读或可写。非阻塞指的是进程在读写文件时,如果没有数据可读或可写,进程会立即返回,而不是一直等待。)                                 
	if(fcntl(fd, F_SETFL, 0) < 0)  // 使用 fcntl 函数将文件描述符设置为阻塞模式
	{  
		debugpri("fcntl failed!\n");  
		return(HI_FALSE);  
	}       
	else  
	{  
		debugpri("fcntl=%d\n",fcntl(fd, F_SETFL,0));  
	}  
	//测试是否为终端设备      
	if(0 == isatty(STDIN_FILENO))  // 使用 isatty 函数检查标准输入是否为终端设备
	{  
		debugpri("standard input is not a terminal device\n");  
		return(HI_FALSE);  
	}  
	else  

	{  
		debugpri("isatty success!\n");  
	}                
	printf("fd->open=%d\n",fd);  
	return fd;  
}  

能够看出,p_id是一个pyhread类型的变量,create_trd_recv是一个函数,HiSerfd是一个类似文件描述符的东西,考虑到这里打开的是串口设备,难道它是设备描述符?

从本菜鸟的角度,目前这个阶段,这个函数会用就行,那么就需要知道该函数的作用、参数、返回值,于是使用最万能的方法,咱们man一下,man pthread_create,得到如下:

强忍着内心的不适,对这里面的内容进行分析

NAME(名字):创建一个新线程,这个就是函数的目的了,它能创建一个新线程

SYNOPSIS(说明):这地方写出来要使用这个函数需要包含<pthread.h>这个头文件,还有函数参数,一共四个参数,参数的类型里面也进行了说明

DESCRIPTION(描述):第一句话上来就说了,这个函数在调用进程中开启一个新线程,新线程通过调用 start_routine()开始执行;arg 作为 start_routine() 的唯一参数传递。结合之前的知识,大概就是可以通过这个函数开启一个新的线程,这个新的线程会执行第三个参数的这个函数,第四个参数是传递给第三个参数的参数。这样,大概就懂了这个函数的第三第四作用。结合变量类型,第一个参数的类型是pthread_t, 那第二个参数还是没有提及,那咱们接着往下看

The new thread terminates in one of the following ways:
这段带星的话每太看懂,接着往下看:

        attr 参数指向一个 pthread_attr_t 结构,创建线程时使用该结构的内容来确定新线程的属性; 该结构使用 pthread_attr_init(3) 和相关函数初始化。
        如果 attr 为 NULL,则创建线程时使用默认属性。

可以看出,这段是对第二个参数的介绍

由此,四个参数以及函数的作用都知道了

最后看一下返回值:成功返回0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值