使用 Musl C 库的时候,内核提供了基于 LOS_XXX 适配实现 pthread、mqeue、fs、semaphore、time 等模块的 posix 接口(//kernel/liteos_m
2024-02-18 15:41:09195 原生Swift编译器是不支持生成Cortex-M机器指令的,但得益于LLVM框架的模块化架构,仅需少许Hack即可为其添加一个现成的Cortex-M后端。
2019-10-07 10:27:002321 POSIX 接口Pthreads 简介POSIX Threads 简称 Pthreads,POSIX 是 “Portable Operating SystemInterface”(可移植操作系统接口
2021-03-29 06:16:52
一.线程属性线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。1.名称:pthread_attr_init/pthread_attr_destroy功能:对线程属性初始化/去除初始化头文件:#include 函数原形:int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);参数:Attr 线程属性变量返回值:若成功返回0,若失败返回-1。 调用pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。 如果要去除对pthread_attr_t结构的初始化,可以调用pthread_attr_destroy函数。如果pthread_attr_init实现时为属性对象分配了动态内存空间,pthread_attr_destroy还会用无效的值初始化属性对象,因此如果经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。 线程属性结构如下:typedef struct{int detachstate; 线程的分离状态int schedpolicy; 线程调度策略struct sched_param schedparam; 线程的调度参数int inheritsched; 线程的继承性int scope; 线程的作用域size_t guardsize; 线程栈末尾的警戒缓冲区大小int stackaddr_set;void * stackaddr; 线程栈的位置size_t stacksize; 线程栈的大小}pthread_attr_t;每个个属性都对应一些函数对其查看或修改。下面我们分别介绍。二、线程的分离状态 线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。 而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状态,则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。2.名称:pthread_attr_getdetachstate/pthread_attr_setdetachstate功能:获取/修改线程的分离状态属性头文件:#include 函数原形:int pthread_attr_getdetachstate(const pthread_attr_t * attr,int *detachstate);int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);参数:Attr 线程属性变量, Detachstate 线程的分离状态属性返回值:若成功返回0,若失败返回-1。 可以使用pthread_attr_setdetachstate函数把线程属性detachstate设置为下面的两个合法值之一:设置为PTHREAD_CREATE_DETACHED,以分离状态启动线程;或者设置为PTHREAD_CREATE_JOINABLE,正常启动线程。可以使用pthread_attr_getdetachstate函数获取当前的datachstate线程属性。(1) 以分离状态创建线程#include void *child_thread(void *arg){printf(“child thread run!\n”);}int main(int argc,char *argv[ ]){pthread_t tid;pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&tid,&attr,fn,arg);pthread_attr_destroy(&attr);sleep(1);}三、线程的继承性 函数pthread_attr_setinheritsched和pthread_attr_getinheritsched分别用来设置和得到线程的继承性,这两个函数的定义如下:3.名称:pthread_attr_getinheritsched /pthread_attr_setinheritsched功能:获得/设置线程的继承性头文件:#include 函数原形:int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);参数:attr 线程属性变量, inheritsched 线程的继承性返回值:若成功返回0,若失败返回-1。 这两个函数具有两个参数,第1个是指向属性对象的指针,第2个是继承性或指向继承性的指针。继承性决定调度的参数是从创建的进程中继承还是使用在schedpolicy和schedparam属性中显式设置的调度信息。Pthreads不为inheritsched指定默认值,因此如果你关心线程的调度策略和参数,必须先设置该属性。 继承性的可能值是PTHREAD_INHERIT_SCHED(表示新现成将继承创建线程的调度策略和参数)和PTHREAD_EXPLICIT_SCHED(表示使用在schedpolicy和schedparam属性中显式设置的调度策略和参数)。如果你需要显式的设置一个线程的调度策略或参数,那么你必须在设置之前将inheritsched属性设置为PTHREAD_EXPLICIT_SCHED.四、线程的调度策略函数pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分别用来设置和得到线程的调度策略。4.名称:pthread_attr_getschedpolicy \pthread_attr_setschedpolicy功能:获得/设置线程的调度策略头文件:#include 函数原形:int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int *policy);int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy);参数:attr 线程属性变量, policy 调度策略返回值:若成功返回0,若失败返回-1。这两个函数具有两个参数,第1个参数是指向属性对象的指针,第2个参数是调度策略或指向调度策略的指针。调度策略可能的值是先进先出(SCHED_FIFO)、轮转法(SCHED_RR),或其它(SCHED_OTHER)。(1) SCHED_FIFO策略允许一个线程运行直到有更高优先级的线程准备好,或者直到它自愿阻塞自己。在SCHED_FIFO调度策略下,当有一个线程准备好时,除非有平等或更高优先级的线程已经在运行,否则它会很快开始执行。(2) SCHED_RR(轮循)策略是基本相同的,不同之处在于:如果有一个SCHED_RR策略的线程执行了超过一个固定的时期(时间片间隔)没有阻塞,而另外的SCHED_RR或SCHBD_FIPO策略的相同优先级的线程准备好时,运行的线程将被抢占以便准备好的线程可以执行。 当有SCHED_FIFO或SCHED_RR策赂的线程在一个条件变量上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤醒。即,如果一个低优先级的SCHED_FIFO线程和一个高优先织的SCHED_FIFO线程都在等待锁相同的互斥且,则当互斥量被解锁时,高优先级线程将总是被首先解除阻塞。五、线程的调度参数 函数pthread_attr_getschedparam 和pthread_attr_setschedparam分别用来设置和得到线程的调度参数。5.名称:pthread_attr_getschedparam \pthread_attr_setschedparam功能:获得/设置线程的调度参数头文件:#include 函数原形:int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);参数:attr 线程属性变量, param sched_param结构返回值:若成功返回0,若失败返回-1。 这两个函数具有两个参数,第1个参数是指向属性对象的指针,第2个参数是sched_param结构或指向该结构的指针。结构sched_param在文件/usr/include /bits/sched.h中定义如下:struct sched_param{int sched_priority;}; 结构sched_param的子成员sched_priority控制一个优先权值,大的优先权值对应高的优先权。系统支持的最大和最小优先权值可以用 sched_get_priority_max函数和sched_get_priority_min函数分别得到。注意:如果不是编写实时程序,不建议修改线程的优先级。因为,调度策略是一件非常复杂的事情,如果不正确使用会导致程序错误,从而导致死锁等问题。如:在多线程应用程序中为线程设置不同的优先级别,有可能因为共享资源而导致优先级倒置。6.名称:sched_get_priority_max \sched_get_priority_min功能:获得系统支持的线程优先权的最大和最小值头文件:#include 函数原形:int sched_get_priority_max(int policy); int sched_get_priority_min(int policy);参数:policy 系统支持的线程优先权的最大和最小值返回值:若成功返回0,若失败返回-1。 下面是上面几个函数的程序例子:#include #include void *child_thread(void *arg){int policy;int max_priority,min_priority;struct sched_param param;pthread_attr_t attr;pthread_attr_init(&attr); /*初始化线程属性变量*/pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED); /*设置线程继承性*/pthread_attr_getinheritsched(&attr,&policy); /*获得线程的继承性*/if(policy==PTHREAD_EXPLICIT_SCHED)printf(“Inheritsched:PTHREAD_EXPLICIT_SCHED\n”);if(policy==PTHREAD_INHERIT_SCHED)printf(“Inheritsched:PTHREAD_INHERIT_SCHED\n”);pthread_attr_setschedpolicy(&attr,SCHED_RR);/*设置线程调度策略*/pthread_attr_getschedpolicy(&attr,&policy);/*取得线程的调度策略*/if(policy==SCHED_FIFO)printf(“Schedpolicy:SCHED_FIFO\n”);if(policy==SCHED_RR)printf(“Schedpolicy:SCHED_RR\n”);if(policy==SCHED_OTHER)printf(“Schedpolicy:SCHED_OTHER\n”);sched_get_priority_max(max_priority);/*获得系统支持的线程优先权的最大值*/sched_get_priority_min(min_priority);/* 获得系统支持的线程优先权的最小值*/printf(“Max priority:%u\n”,max_priority);printf(“Min priority:%u\n”,min_priority);param.sched_priority=max_priority;pthread_attr_setschedparam(&attr,¶m);/*设置线程的调度参数*/printf(“sched_priority:%u\n”,param.sched_priority);/*获得线程的调度参数*/pthread_attr_destroy(&attr);}int main(int argc,char *argv[ ]){pthread_t child_thread_id;pthread_create(&child_thread_id,NULL,child_thread,NULL);pthread_join(child_thread_id,NULL);}六、线程的作用域 函数pthread_attr_setscope和pthread_attr_getscope分别用来设置和得到线程的作用域,这两个函数的定义如下:7.名称:pthread_attr_setscope\pthread_attr_getscope功能:获得/设置线程的作用域头文件:#include 函数原形:int pthread_attr_setscope(pthread_attr_t *attr,int scope);int pthread_attr_getscope(const pthread_attr_t *attr,int *scope);参数:attr 线程属性变量, scope 线程的作用域返回值:若成功返回0,若失败返回-1。 这两个函数具有两个参数,第1个是指向属性对象的指针,第2个是作用域或指向作用域的指针,作用域控制线程是否在进程内或在系统级上竞争资源,可能的值是PTHREAD_SCOPE_PROCESS(进程内竞争资源),PTHREAD_SCOPE_SYSTEM.(系统级上竞争资源)。七、线程堆栈的大小 函数pthread_attr_setstacksize和pthread_attr_getstacksize分别用来设置和得到线程堆栈的大小,这两个函数的定义如下所示:8.名称:pthread_attr_getdetstacksize\pthread_attr_setstacksize功能:获得/修改线程栈的大小头文件:#include 函数原形:int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,size_t *restrict stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);参数:attr 线程属性变量,stacksize 堆栈大小返回值:若成功返回0,若失败返回-1。 这两个参数具有两个参数,第1个是指向属性对象的指针,第2个是堆栈大小或指向堆栈大小的指针.如果希望改变栈的默认大小,但又不想自己处理线程栈的分配问题,这时使用pthread_attr_setstacksize函数就非常有用。八、线程堆栈的地址函数pthread_attr_setstackaddr和pthread_attr_getstackaddr分别用来设置和得到线程堆栈的位置,这两个函数的定义如下:9.名称:pthread_attr_setstackaddr\pthread_attr_getstackaddr功能:获得/修改线程栈的位置头文件:#include 函数原形:int pthread_attr_getstackaddr(const pthread_attr_t *attr,void **stackaddf);int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);参数:attr 线程属性变量,stackaddr 堆栈地址返回值:若成功返回0,若失败返回-1。这两个函数具有两个参数,第1个是指向属性对象的指针,第2个是堆栈地址或指向堆栈地址的指针。九、线程栈末尾的警戒缓冲区大小函数pthread_attr_getguardsize和pthread_attr_setguardsize分别用来设置和得到线程栈末尾的警戒缓冲区大小,这两个函数的定义如下:10.名称:pthread_attr_getguardsize/pthread_attr_setguardsize功能:获得/修改线程栈末尾的警戒缓冲区大小头文件:#include 函数原形:int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict guardsize);int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize);参数:返回值:若成功返回0,若失败返回-1。 线程属性guardsize控制着线程栈末尾之后以避免栈溢出的扩展内存大小。这个属性默认设置为PAGESIZE个字节。可以把guardsize线程属性设为0,从而不允许属性的这种特征行为发生:在这种情况下不会提供警戒缓存区。同样地,如果对线程属性stackaddr作了修改,系统就会假设我们会自己管理栈,并使警戒栈缓冲区机制无效,等同于把guardsize线程属性设为0。
2013-09-29 11:00:50
一.线程属性线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。1.名称:pthread_attr_init/pthread_attr_destroy功能:对线程属性初始化/去除初始化头文件:#include 函数原形:参数:Attr 线程属性变量int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);返回值:若成功返回0,若失败返回-1。 调用pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。 如果要去除对pthread_attr_t结构的初始化,可以调用pthread_attr_destroy函数。如果pthread_attr_init实现时为属性对象分配了动态内存空间,pthread_attr_destroy还会用无效的值初始化属性对象,因此如果经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。 线程属性结构如下:typedef struct{int detachstate; 线程的分离状态int schedpolicy; 线程调度策略struct sched_param schedparam; 线程的调度参数int inheritsched; 线程的继承性int scope; 线程的作用域size_t guardsize; 线程栈末尾的警戒缓冲区大小int stackaddr_set;void * stackaddr; 线程栈的位置size_t stacksize; 线程栈的大小}pthread_attr_t;每个个属性都对应一些函数对其查看或修改。下面我们分别介绍。二、线程的分离状态 线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。 而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状态,则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。2.名称:pthread_attr_getdetachstate/pthread_attr_setdetachstate功能:获取/修改线程的分离状态属性头文件:#include 函数原形:int pthread_attr_getdetachstate(const pthread_attr_t * attr,int *detachstate);int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);参数:Attr 线程属性变量, Detachstate 线程的分离状态属性返回值:若成功返回0,若失败返回-1。 可以使用pthread_attr_setdetachstate函数把线程属性detachstate设置为下面的两个合法值之一:设置为PTHREAD_CREATE_DETACHED,以分离状态启动线程;或者设置为PTHREAD_CREATE_JOINABLE,正常启动线程。可以使用pthread_attr_getdetachstate函数获取当前的datachstate线程属性。(1) 以分离状态创建线程#include void *child_thread(void *arg){printf(“child thread run!\n”);}int main(int argc,char *argv[ ]){pthread_t tid;pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&tid,&attr,fn,arg);pthread_attr_destroy(&attr);sleep(1);}三、线程的继承性 函数pthread_attr_setinheritsched和pthread_attr_getinheritsched分别用来设置和得到线程的继承性,这两个函数的定义如下:3.名称:pthread_attr_getinheritsched /pthread_attr_setinheritsched功能:获得/设置线程的继承性头文件:#include 函数原形:int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);参数:attr 线程属性变量, inheritsched 线程的继承性返回值:若成功返回0,若失败返回-1。 这两个函数具有两个参数,第1个是指向属性对象的指针,第2个是继承性或指向继承性的指针。继承性决定调度的参数是从创建的进程中继承还是使用在schedpolicy和schedparam属性中显式设置的调度信息。Pthreads不为inheritsched指定默认值,因此如果你关心线程的调度策略和参数,必须先设置该属性。 继承性的可能值是PTHREAD_INHERIT_SCHED(表示新现成将继承创建线程的调度策略和参数)和PTHREAD_EXPLICIT_SCHED(表示使用在schedpolicy和schedparam属性中显式设置的调度策略和参数)。如果你需要显式的设置一个线程的调度策略或参数,那么你必须在设置之前将inheritsched属性设置为PTHREAD_EXPLICIT_SCHED.四、线程的调度策略函数pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分别用来设置和得到线程的调度策略。4.名称:pthread_attr_getschedpolicy \pthread_attr_setschedpolicy功能:获得/设置线程的调度策略头文件:#include 函数原形:int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int *policy);int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy);参数:attr 线程属性变量, policy 调度策略返回值:若成功返回0,若失败返回-1。这两个函数具有两个参数,第1个参数是指向属性对象的指针,第2个参数是调度策略或指向调度策略的指针。调度策略可能的值是先进先出(SCHED_FIFO)、轮转法(SCHED_RR),或其它(SCHED_OTHER)。(1) SCHED_FIFO策略允许一个线程运行直到有更高优先级的线程准备好,或者直到它自愿阻塞自己。在SCHED_FIFO调度策略下,当有一个线程准备好时,除非有平等或更高优先级的线程已经在运行,否则它会很快开始执行。(2) SCHED_RR(轮循)策略是基本相同的,不同之处在于:如果有一个SCHED_RR策略的线程执行了超过一个固定的时期(时间片间隔)没有阻塞,而另外的SCHED_RR或SCHBD_FIPO策略的相同优先级的线程准备好时,运行的线程将被抢占以便准备好的线程可以执行。 当有SCHED_FIFO或SCHED_RR策赂的线程在一个条件变量上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤醒。即,如果一个低优先级的SCHED_FIFO线程和一个高优先织的SCHED_FIFO线程都在等待锁相同的互斥且,则当互斥量被解锁时,高优先级线程将总是被首先解除阻塞。五、线程的调度参数 函数pthread_attr_getschedparam 和pthread_attr_setschedparam分别用来设置和得到线程的调度参数。5.名称:pthread_attr_getschedparam \pthread_attr_setschedparam功能:获得/设置线程的调度参数头文件:#include 函数原形:int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);参数:attr 线程属性变量, param sched_param结构返回值:若成功返回0,若失败返回-1。 这两个函数具有两个参数,第1个参数是指向属性对象的指针,第2个参数是sched_param结构或指向该结构的指针。结构sched_param在文件/usr/include /bits/sched.h中定义如下:struct sched_param{int sched_priority;}; 结构sched_param的子成员sched_priority控制一个优先权值,大的优先权值对应高的优先权。系统支持的最大和最小优先权值可以用 sched_get_priority_max函数和sched_get_priority_min函数分别得到。注意:如果不是编写实时程序,不建议修改线程的优先级。因为,调度策略是一件非常复杂的事情,如果不正确使用会导致程序错误,从而导致死锁等问题。如:在多线程应用程序中为线程设置不同的优先级别,有可能因为共享资源而导致优先级倒置。6.名称:sched_get_priority_max \sched_get_priority_min功能:获得系统支持的线程优先权的最大和最小值头文件:#include 函数原形:int sched_get_priority_max(int policy); int sched_get_priority_min(int policy);参数:policy 系统支持的线程优先权的最大和最小值返回值:若成功返回0,若失败返回-1。 下面是上面几个函数的程序例子:#include #include void *child_thread(void *arg){int policy;int max_priority,min_priority;struct sched_param param;pthread_attr_t attr;pthread_attr_init(&attr); /*初始化线程属性变量*/pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED); /*设置线程继承性*/pthread_attr_getinheritsched(&attr,&policy); /*获得线程的继承性*/if(policy==PTHREAD_EXPLICIT_SCHED)printf(“Inheritsched:PTHREAD_EXPLICIT_SCHED\n”);if(policy==PTHREAD_INHERIT_SCHED)printf(“Inheritsched:PTHREAD_INHERIT_SCHED\n”);pthread_attr_setschedpolicy(&attr,SCHED_RR);/*设置线程调度策略*/pthread_attr_getschedpolicy(&attr,&policy);/*取得线程的调度策略*/if(policy==SCHED_FIFO)printf(“Schedpolicy:SCHED_FIFO\n”);if(policy==SCHED_RR)printf(“Schedpolicy:SCHED_RR\n”);if(policy==SCHED_OTHER)printf(“Schedpolicy:SCHED_OTHER\n”);sched_get_priority_max(max_priority);/*获得系统支持的线程优先权的最大值*/sched_get_priority_min(min_priority);/* 获得系统支持的线程优先权的最小值*/printf(“Max priority:%u\n”,max_priority);printf(“Min priority:%u\n”,min_priority);param.sched_priority=max_priority;pthread_attr_setschedparam(&attr,¶m);/*设置线程的调度参数*/printf(“sched_priority:%u\n”,param.sched_priority);/*获得线程的调度参数*/pthread_attr_destroy(&attr);}int main(int argc,char *argv[ ]){pthread_t child_thread_id;pthread_create(&child_thread_id,NULL,child_thread,NULL);pthread_join(child_thread_id,NULL);}六、线程的作用域 函数pthread_attr_setscope和pthread_attr_getscope分别用来设置和得到线程的作用域,这两个函数的定义如下:7.名称:pthread_attr_setscope\pthread_attr_getscope功能:获得/设置线程的作用域头文件:#include 函数原形:int pthread_attr_setscope(pthread_attr_t *attr,int scope);int pthread_attr_getscope(const pthread_attr_t *attr,int *scope);参数:attr 线程属性变量, scope 线程的作用域返回值:若成功返回0,若失败返回-1。 这两个函数具有两个参数,第1个是指向属性对象的指针,第2个是作用域或指向作用域的指针,作用域控制线程是否在进程内或在系统级上竞争资源,可能的值是PTHREAD_SCOPE_PROCESS(进程内竞争资源),PTHREAD_SCOPE_SYSTEM.(系统级上竞争资源)。七、线程堆栈的大小 函数pthread_attr_setstacksize和pthread_attr_getstacksize分别用来设置和得到线程堆栈的大小,这两个函数的定义如下所示:8.名称:pthread_attr_getdetstacksize\pthread_attr_setstacksize功能:获得/修改线程栈的大小头文件:#include 函数原形:int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,size_t *restrict stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);参数:attr 线程属性变量,stacksize 堆栈大小返回值:若成功返回0,若失败返回-1。 这两个参数具有两个参数,第1个是指向属性对象的指针,第2个是堆栈大小或指向堆栈大小的指针.如果希望改变栈的默认大小,但又不想自己处理线程栈的分配问题,这时使用pthread_attr_setstacksize函数就非常有用。八、线程堆栈的地址函数pthread_attr_setstackaddr和pthread_attr_getstackaddr分别用来设置和得到线程堆栈的位置,这两个函数的定义如下:9.名称:pthread_attr_setstackaddr\pthread_attr_getstackaddr功能:获得/修改线程栈的位置头文件:#include 函数原形:int pthread_attr_getstackaddr(const pthread_attr_t *attr,void **stackaddf);int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);参数:attr 线程属性变量,stackaddr 堆栈地址返回值:若成功返回0,若失败返回-1。这两个函数具有两个参数,第1个是指向属性对象的指针,第2个是堆栈地址或指向堆栈地址的指针。九、线程栈末尾的警戒缓冲区大小函数pthread_attr_getguardsize和pthread_attr_setguardsize分别用来设置和得到线程栈末尾的警戒缓冲区大小,这两个函数的定义如下:10.名称:pthread_attr_getguardsize/pthread_attr_setguardsize功能:获得/修改线程栈末尾的警戒缓冲区大小头文件:#include 函数原形:int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict guardsize);int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize);参数:返回值:若成功返回0,若失败返回-1。 线程属性guardsize控制着线程栈末尾之后以避免栈溢出的扩展内存大小。这个属性默认设置为PAGESIZE个字节。可以把guardsize线程属性设为0,从而不允许属性的这种特征行为发生:在这种情况下不会提供警戒缓存区。同样地,如果对线程属性stackaddr作了修改,系统就会假设我们会自己管理栈,并使警戒栈缓冲区机制无效,等同于把guardsize线程属性设为0。
2013-09-29 16:00:28
posix嵌入式操作系统What is POSIX? We hear this term in Linux and Unix world but do not understand
2021-12-27 08:31:38
posix嵌入式操作系统What is POSIX? We hear this term in Linux and Unix world but do not understand
2021-12-28 11:13:46
(Hardware Driver Foundation)引入统一驱动框架HDF,统一驱动标准,为设备厂商提供了更统一的接入方式,使驱动更加容易移植,力求做到一次开发,多系统部署。支持1200+标准POSIX接口
2022-05-10 10:52:01
本文将为您介绍关于POSIX定时器的相关知识点。因为要使用绝对时间,存在系统时间被调节的可能性,指定时间段内下发通知等需求,排除了jiffies相关的定时器、依赖于系统运行时间的定时器、alarm
2022-12-12 14:59:29
:
第一:Linux拥有超过30亿用户,是很受欢迎的操作系统之一。此外,在要求苛刻的嵌入式系统行业中,嵌入式Linux约占嵌入式设计的70%。
第二:便携式操作系统接口(POSIX)起源于20世纪
2023-05-18 13:59:26
报错信息如下图:dfs_posix.c128 first defined here错误信息定位到了这里,因为在其他版本上已经成功挂载DFS,所以操作基本一样。但是这个错误不知道为什么。
2023-01-11 14:21:58
4.10的内核,使用posix,使能文件系统,使用fd_set定义变量报错,显示error: unknown type name 'fd_set',随后定位错误发现有三个文件夹的select.h文件
2022-11-03 11:01:03
rt_pipe_xxx , 也对接了 posix 接口。二. 怎么使用管道在使用之前先看一下 pipe 的结构体通过上面的结构体可以先尝试分析以下管道的实现原理:is_named :确定是匿名管道,还是实名
2022-04-14 14:57:20
RTThread中POSIX兼容层里自旋锁的加锁实现好像不太对。如代码所示:int pthread_spin_lock (pthread_spinlock_t *lock){
2023-02-01 15:54:34
串口数据一切正常,只有msh回显数据是乱码,打开了RT_USING_POSIX,
2022-05-11 09:32:45
'可是pthread.h包含的<sys/types.h>中_POSIX_THREADS没定义,所以连typedef __uint32_t pthread_t都没生效!到底
2009-08-13 17:58:46
make CROSS_COMPILE=/xxx/xxx/xxx/arm-linux/target/bin/arm-linux-备注:若出现 对‘posix_madvise’未定义的引用 的错误...
2021-12-27 07:53:39
使用Linux系统提供的机制来对线程访问资源的顺序进行同步,本文档挑选了信号量,互斥锁,条件变量来介绍线程同步机制,实验代码在sync/目录下。1 POSIX无名信号量本章介绍POSIX 无名信号量,以下简称
2021-04-02 14:04:09
linux多线程环境下gettid() pthread_self() 两个函数都获得线程ID,但这2个ID有所不同gettid是内核中的线程的ID:POSIX thread ID可以在一个进程内唯一
2019-07-09 08:36:48
{ BAUD50, //POSIX ONLY BAUD75,// POSIX BAUD110, BAUD134,// 仅 POSIX BAUD150,// 仅POSIX BAUD200,// 仅POSIX
2022-01-11 06:19:07
。/* Signals.*/#define SIGHUP 1 /* Hangup (POSIX).*/#define SIGINT 2 /* Interrupt (ANSI).*/#define SIGQUIT3
2016-10-15 14:47:45
我既不是 ST 专家也不是 RTC 专家,无论如何。但我已经看到其他公司的几个实现,我不得不说 RTC 作为计数器(提供与 posix 兼容时间戳接口的硬件,通常是 32 位秒 + 15 个小数位
2022-12-20 06:58:46
什么是POSIX无名信号量呢?怎样去使用POSIX无名信号量呢?
2022-03-02 07:38:01
QNX是一个实时的、可扩充的操作系统;它部分遵循POSIX相关标准,如POSIX.1b 实时扩展;它提供了一个很小的微内核以及一些可选的配合进程。其内核仅提供4种服务:进程调度、进程间通信、底层
2011-06-07 14:16:29
import os#返回操作系统类型,值为posix,是linux操作系统,值为nt,是window操作系统
2019-07-23 07:00:48
我在ENV工具里配置上了flashDB,然后编译就报出找不到dfs_posix.h。是不是这个依赖关系env没有做好啊
2022-03-28 14:18:44
POSIX Threads简称Pthreads,POSIX是"Portable Operating System Interface"(可移植操作系统接口) 的缩写,POSIX
2022-08-12 15:02:18
(winsock2) 以及本篇三篇文章的基础工作才实现的。结束语因为有前一篇的工作,本次增加 lwip 支持的说明就一带而过了。rt-thread 是支持 POSIX 的,如果直接使用 POSIX 接口
2022-09-05 16:43:01
使用studio添加了onenet的软件包后报错找不到dfs_posix.h文件,如何使用studio配置解决这个问题?
2023-02-14 10:42:35
ot-deamon 无法与 K32W 加密狗通信并给出以下错误[./build/posix/src/posix/ot-daemon[23634]:运行 OPENTHREAD
2023-03-14 07:41:57
也作为一个server与应用通信。应用的接口调用和主动上报监听则主要通过消息队列的机制传递。恰好,RT smart中的消息队列另一位同学已经分享过了,讲解的很详细,基于POSIX的应用开发之消息队列
2022-07-15 11:51:54
在移植wavplay过程中,发现文件读取异常,获取的WAV文件描述错误。wavplay中用到fopen、fread。在使用fread读取文件时,会根据文件的大小出现异常;在文件很小时,读出是正确的;在文件比较大时(超出一个scetor时),读出是错误的。采用2b.wav测试文件6737036字节,7b.wav为2b.wav的前80个字节。如图所示,我用2b.wav时,读取wavheader_read时,我用7b.wav时,读取wavheader_read时,配置如下:请问,这个问题要如何解决?刚刚写了个读写测试函数,fread的前512个字节,是无法读取到的,相当于往后偏移了512个字节。问题解决了,确认是BSP驱动的BUG。用的是华芯微特swm32的BSP,在swm_sdio_rxconfig中,使用2个块,但是写入BUF地址没有实现块的偏移,导致BUF只有1个块的数据。
2023-02-13 13:57:27
目录简介TI-RTOSFreeRTOSPOSIX运行时对象查看器 (Runtime Object Viewer)TI-POSIX 介绍在源代码中使用 POSIXTI-POSIX支持的函数摘要线程函数
2022-02-15 07:49:16
DFS_USING_POSIX#define DFS_USING_WORKDIR#define DFS_FILESYSTEMS_MAX 5#define DFS_FILESYSTEM_TYPES_MAX 4#define
2022-08-25 14:18:45
FINSH_ARG_MAX 10#define RT_USING_DFS#define DFS_USING_POSIX#define DFS_USING_WORKDIR#define
2023-02-08 10:37:13
给各位大佬倒茶,想求助下在开启RT_USING_POSIX时,串口getc()函数到系统getchar()函数之间的调用路径。小弟在调试大佬编写的的web_terminal组件时发现如果开启了
2022-11-14 14:17:02
有没有哪位道友,成功的使用过agile_modbus协议栈的modbus_tcp啊,我看官方给的DEMO都是基于posix接口写的,但是本人不太清除posix接口。有没有哪位道友在RTThread内核的基础之上移植成功的啊。请教一下
2022-11-09 14:27:04
看看有什么问题,然后发现困难重重,于是退而求其次,先测试 serialX 的 posix 接口。测试环境开发板: NK-980IOT V1.0 的开发板rt-thread 版本:4.1.1IDE:keil
2023-02-14 11:29:57
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据。
2019-07-25 07:14:44
各位好,请问下在开启posix支持后finsh无法输入,关闭posix后finsh正常。跟踪代码发现开启posix支持后finsh_getchar()和不开启走的分支不一样。开启posix走
2022-11-14 14:14:35
by RT-Thread teampthread_create successi'm thread1 and i will detach myself!posix thread 0posix thread
2022-09-01 14:25:39
vm虚拟机:通过软件的方法模拟pc为什么不选择双系统?嵌入式开发与内核交互,会导致系统崩溃Linux介绍(posix、GPL、GUN)1991年 Linux0.1问世发布在GPL。GPL是一个开源
2021-12-15 07:03:15
什么是QNX操作系统
QNX是一个实时的、可扩充的操作系统;它部分遵循POSIX相关标准,如POSIX.1b 实时扩展;它提供了一个很小的微内核以及一些可
2009-06-17 00:35:164632 这是一个关于Posix线程编程的专栏。作者在阐明概念的基础上,将向您详细讲述Posix线程库API。本文是第一篇将向您讲述线程的创建与取消。 相对进程而言,线程是一个更加接近于执行
2011-07-26 11:10:580 2015-10-19 14:00:0345 POSIX既然是可移植操作系统接口,那基于该接口的应用程序可移植性自然是很高的。基于POSIX接口设计的应用程序可以在不做修改或仅做极少量的修改就可以在支持POSIX的不同RTOS之间移植。如果
2017-11-14 08:45:565303 最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;Posix IPC包括:Posix消息队列、Posix信号灯、Posix共享内存区。
2018-05-31 05:14:00457 of the portable operating system interface for Unix* (POSIX) file system behavior and burst buffers.
2018-10-26 06:10:001514 通过学习这本实用的参考书,你将理解有关线程的坚实基础,并学会如何将这一强大的编程模型应用到实际工作中。
多线程编程的主要优势在于通过利用多处理器的并行数字运算能力,或者通过在代码中自动使用I/O并发功能,以达到同时执行多项任务的目的,即使是在单处理器机器上。结果是: 程序运行更快、响应速度更快、通常更容易维护。多线程编程尤其适用于网络编程,可帮助削弱慢速网络I/O带来的瓶颈问题。
2018-11-26 08:00:000 内核级线程和进程是一样的,前者与POSIX线程(pthread)有很大的区别。因此,内核的进程调度策略和系统调用也适用于内核级线程。
2019-04-23 14:58:255343 //获得信号量sem的当前的值,放到sval中。如果有线程正在block这个信号量,sval可能返回两个值,0或“-正在block的线程的数目”,Linux返回0//成功返回0,失败返回-1设errno//Link with -pthread.int sem_getvalue(sem_t *sem, int *sval);
2019-05-16 17:39:24809 本文主要介绍Linux信号系统和如何使用POSIX API来响应信号。本文中的示例适用于Linux系统和大部分POSIX兼容系统。
2019-05-02 14:40:001277 模型#include //for fstat()#include //for fstat()#include #include #include shm_open() //创建/获取共享内存fd ftruncate() //创建者调整文件大小 mmap() //映射fd到内存 munmap() //去映射fd shm_unlink() //删除共享内存 shm_open//创建/获取共享内存的文件描述符,成功返回文件描述符,失败返回-1//Link with -lrt.int shm_open(const char *name, int oflag, mode_t mode);oflagAccess Mode:O_RDONLY以只读的方式打开共享内存对象O_RDWR以读写的方式打开共享内存对象Opening-time flags(Bitwise Or):O_CREAT 表示创建共享内存对象,刚被创建的对象会被初始化为0byte可以使用ftuncate()调整大小O_EXCL用来确保共享内存对象被成功创建,如果对象已经存在,那么返回错误O_TRUNC表示如果共享内存对象已经存在那么把它清空mode: eg,0664 etcftruncate()//调整fd指向文件的大小,成功返回0,失败返回-1设errno//VS truncate()int ftruncate(int fd, off_t length);如果原文件大小>指定大小,原文件中多余的部分会被截除int res=ftruncate(fd,3*sizeof(Emp));//要用sizeof,且是Emp(类型)不是emp(对象)if(-1==res) perror("ftruncate"),exit(-1);fstat()//获取文件状态,成功返回0,失败返回-1设errno//VS stat()int lstat(const char *pathname, struct stat *buf);int fstat(int fd, struct stat *buf);buf:stat类型的指针struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ 八进制 usigned int o% nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ ld% blksize_t st_blksize; /* blocksize for filesystem I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ struct timespec st_atim; /* time of last access */ struct timespec st_mtim; /* time of last modification */ ld%,秒 struct timespec st_ctim; /* time of last status change */};//eg:st_mode=100664 //100是文件类型 //664是权限, 通过100664和0777BitwiseAND得到st_mtime=1462787968 //秒mmap()//映射文件或设备到进程的虚拟内存空间,映射成功后对相应的文件或设备操作就相当于对内存的操作//映射以页为基本单位,文件大小, mmap的参数 len 都不能决定进程能访问的大小, 而是容纳文件被映射部分的最小页面数决定传统文件访问//要求对文件进行可读可写的的打开!!!//成功返回映射区的指针,失败返回-1设errno void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); //prot:protection, 权限addr:映射的起始地址, 如果为NULL则由kernel自行选择->最合适的方法length:映射的区域长度prot:映射内存的保护权限PROT_EXEC表示映射的内存页可执行PROT_READ表示映射的内存可被读PROT_WRITE表示映射的内存可被写PROT_NONE表示映射的内存不可访问flagsmust include one of :MAP_SHARED表示共享这块映射的内存,读写这块内存相当于直接读写文件,这些操作对其他进程可见,由于OS对文件的读写都有缓存机制,所以实际上不会立即将更改写入文件,除非带哦用msync()或mumap()MAP_PRIVATE表示创建一个私有的copy-on-write的映射, 更新映射区对其他映射到这个文件的进程是不可见的can be Bitwise ORed:MAP_32BIT把映射区的头2GB个字节映射到进程的地址空间,仅限域x86-64平台的64位程序,在早期64位处理器平台上,可以用来提高上下文切换的性能。当设置了MAP_FIXED时此选项自动被忽略MAP_ANONYMOUS映射不会备份到任何文件,fd和offset参数都被忽略,通常和MAP_SHARED连用MAP_DENYWRITEignored.MAP_EXECUTABLEignoredMAP_FILE用来保持兼容性,ignoredMAP_FIXED不要对addr参数进行处理确确实实的放在addr指向的地址,此时addr一定时页大小的整数倍,MAP_GROWSDOWN用在栈中,告诉VMM映射区应该向低地址扩展MAP_HUGETLB (since Linux 2.6.32)用于分配"大页"fd: file decriptoroffset: 文件中的偏移量void* pv=mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);if(MAP_FAILED==pv) perror("mmap"),exit(-1);映射机制小解mmap()就是建立一个指针,这个指针指向页高速缓存的一页,并假设这个页有我们想要访问的文件内容(此时都在虚拟地址空间),当然,这个页描述符会自动的加入的调用进程的页表中。当我们第一次使用这个指针,去访问这个虚拟地址的页时,发现这个页还没有分配物理页框,没有想要的文件,引起缺页中断,系统会把相应的(fd)文件内容放到高速缓存的物理页框(此时才会有对物理地址空间的读写)映射过程中使用的文件相当于药引子,因为所有进程都是可以通过VFS访问磁盘文件的,所以这个文件相当于对映射内存的一个标识,有了这个位于磁盘的药引子,很多进程都可以根据它找到同一个物理页框,进而实现内存的共享,并不是说就在磁盘上读写页高速缓存的内容不会立即写到磁盘中,会等几秒,这种机制可以提高效率并保护磁盘只要内存够大,页高速缓存的内容就会一直存在内存中,以后再有进程对该缓存页的内容访问的需求,就不需要从磁盘中搜索,直接访问缓存页(把这个页加入到进程的页表)就行mmap()是系统调用,使用一次的开销比较大,但比文件读写的read()/write()进行内核空间到用户空间的数据复制要快,通常只有需要分配的内存>128KB(malloc一次分配33page就是128KB)的时候才会使用mmap()/shm是一个特殊的文件系统,它不对应磁盘中的区域,而是内存中,所以使用mmap()在这个文件系统中创/proc 不占用任何磁盘空间linux采用的是页式管理机制。对于用mmap()映射普通文件来说,进程会在自己的地址空间新增一块空间,空间大小由mmap()的len参数指定,注意,进程并不一定能够对全部新增空间都能进行有效访问。进程能够访问的有效地址大小取决于文件被映射部分的大小。简单的说,能够容纳文件被映射部分大小的最少页面个数决定了进程从mmap()返回的地址开始,能够有效访问的地址空间大小。超过这个空间大小,内核会根据超过的严重程度返回发送不同的信号给进程。经过内核!=在内核空间和用户空间来回切换!=在内核空间和用户空间传递复制的数据页是内存映射的基本单位, 可以理解为实际分配给物理内存的基本单位, 但不是数据操作的基本单位;页机制是操作系统和CPU约定好的一种方式,OS按照页给CPU按页发虚拟地址,CPU按页解析并处理操作系统(包括Linux)大量使用的缓存的两个原理:CPU访问内存的速度远远大于访问磁盘的速度(访问速度差距不是一般的大,差好几个数量级)数据一旦被访问,就有可能在短期内再次被访问(临时局部原理)页高速缓存(page cache)是个内存区域,是Linux 内核使用的主要磁盘高速缓存,在绝大多数情况下,内核在读写磁盘时都引用页高速缓存,新页被追加到页高速缓存以满足用户态进程的读请求,如果页不在高速缓存中,新页就被加到高速缓存中,然后就从磁盘读出的数据填充它,如果内存有足够的空闲空间,就让该页在高速缓存中长期保留,使其他进程再使用该页时不再访问磁盘, 即磁盘上的文件缓存到内存后,它的虚拟内存地址可以有多个,但是物理内存地址却只能有一个我们要读写磁盘文件时,实质是对页高速缓存进行读写,所以无论读写,都会首先检查页高速缓存有没有这个文件对应的页,如果有,就直接访问,如果没有,就引起缺页中断,给OS发信号,让它把文件放到高速缓存再进行读写,这个过程不经过内核空间到用户空间复制数据OS中的页机制,对应到硬件中可不一定在主存中,也可以是高速缓存etc,但不会是磁盘,因为磁盘文件的地址和内存不一样,不是按照32位编址的,而是按照ext2 etc方式编址的,需要使用文件管理系统,在Linux中使用VFS和实际文件管理系统来管理文件,所以对于Linux,有两个方式使用系统资源:VMM,VFS,前者用来管理绝大部分的内存,后者用来管理所有的文件和部分特殊文件系统(eg:/shm是内存的一块区域)page cache可以看作二者的桥梁,把磁盘文件放到高速缓存,就可以按照内存的使用方式使用磁盘的文件,使用完再释放或写回磁盘page cache中的页可能是下面的类型:含有普通文件数据的页含有目录的页含有直接从块设备(跳过文件系统层)读出的数据的页含有用户态进程数据的页,但页中的数据已经被交换到硬盘属于他书文件系统文件的页映射:一个线性区可以和磁盘文件系统的普通文件的某一部分或者块设备文件相关联,这就意味着内核把对区线性中页内某个字节的访问转换成对文件中相应字节的操作TLB(Translation Lookaside Buffer)高速缓存用于加快线性地址的转换,当一个线性地址第一次被使用时,通过慢速访问RAM中的页表计算出相应的物理地址,同时,物理地址被存放在TLB表项(TLB entry),以便以后对同一个线性地址的引用可以快速得到转换在初始化阶段,内核必须建立一个物理地址映射来指定哪些物理地址范围对内核可用,哪些不可用swap(内存交换空间)的功能是应付物理内存不足的情况下所造成的内存扩展记录的功能,CPU所读取的数据都来自于内存,那当内存不足的时候,为了让后续的程序可以顺序运行,因此在内存中暂不使用的程序和数据就会被挪到swap中,此时内存就会空出来给需要执行的程序加载,由于swap是使用硬盘来暂时放置内存中的信息,所以用到swap时,主机硬盘灯就会开始闪个不同Q:CPU只能对内存进行读写,但又是怎么读写硬盘的呢???A:把数据写入page cache,再经由。。。写入磁盘(包括swap) --《鸟哥》P10内存本身没有计算能力,寻址之类的都是CPU的事,只是为了简便起见,我们通常画成从内存地址A跳到内存地址BOS是软件的核心,CPU是执行的核心前者给后者发指令我要干什么,CPU把他的指令变成现实二者必须很好的匹配计算机才能很好的工作Linux内核中与文件Cache操作相关的API有很多,按其使用方式可以分成两类:一类是以拷贝方式操作的相关接口, 如read/write/sendfile等,其中sendfile在2.6系列的内核中已经不再支持;另一类是以地址映射方式操作的相关接口,如mmap等。第一种类型的API在不同文件的Cache之间或者Cache与应用程序所提供的用户空间buffer之间拷贝数据,其实现原理如图7所示。第二种类型的API将Cache项映射到用户空间,使得应用程序可以像使用内存指针一样访问文件,Memory map访问Cache的方式在内核中是采用请求页面机制实现的,首先,应用程序调用mmap(),陷入到内核中后调用do_mmap_pgoff。该函数从应用程序的地址空间中分配一段区域作为映射的内存地址,并使用一个VMA(vm_area_struct)结构代表该区域,之后就返回到应用程。当应用程序访问mmap所返回的地址指针时(图中4),由于虚实映射尚未建立,会触发缺页中断。之后系统会调用缺页中断处理函数,在缺页中断处理函数中,内核通过相应区域的VMA结构判断出该区域属于文件映射,于是调用具体文件系统的接口读入相应的Page Cache项,并填写相应的虚实映射表。经过这些步骤之后,应用程序就可以正常访问相应的内存区域了。mumap()//接触文件或设备对内存的映射,成功返回0,失败返回-1设errnoint munmap(void *addr, size_t length);shm_unlink()//关闭进程打开的共享内存对象,成功返回0,失败返回-1//Link with -lrt.int shm_unlink(const char *name);
2019-04-02 14:46:41194 POSIX mq VS Sys V mq的优势更简单的基于文件的应用接口完全支持消息优先级(优先级最终决动队列中消息的位置)完全支持消息到达的异步通知,这通过信号或是线程创建实现用于阻塞
2019-04-02 14:46:43469 阻塞式I/O,即Blocking I/O。用户发起一个recvfrom系统调用,内核会等待数据从网络中到达。一旦数据准备就绪,系统内核将把自己的缓冲区中的数据拷贝到用户进程的缓冲区。在系统内核等待数据、复制数据的过程中,用户进程是不能做其他任何事情的,只能等待内核完成上述一系列的操作。
2019-04-27 18:19:002938 ls 命令可以列出一个 POSIX 系统上的文件。这是一个简单的命令,但它经常被低估,不是它能做什么(因为它确实只做了一件事),而是你该如何优化对它的使用。
2019-08-11 10:55:223001 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
2019-11-06 11:42:06567 Linux:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
2019-11-06 14:03:291819 IT之家了解到,Wine (Wine Is Not an Emulator)是一个能够在多种 POSIX-compliant 操作系统(包括 Linux,Mac OSX 及 BSD 等)上运行 Windows 应用的兼容层。
2020-03-14 09:33:112054 Linux很强大,它是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
2020-04-13 08:58:58974 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
2020-05-21 09:17:335728 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
2020-05-27 09:37:215458 《多线程编程指南》介绍了 SolarisTM 操作系统 (Solaris Operating System, Solaris OS)中 POSIX®线程和 Solaris 线程的多线程编程接口
2020-06-11 08:00:004 ,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性
2020-07-02 08:14:003537 DFS 的层次架构如下图所示,主要分为 POSIX 接口层、虚拟文件系统层和设备抽象层。
2020-07-08 15:29:194393 上一章,讲述了 SYSTEM V 信号量,主要运行于进程之间,本章主要介绍 POSIX 信号量:有名信号量、无名信号量。 POSIX 信号量 POSIX 信号量进程是 3 种 IPC
2020-10-29 17:34:14413 rt-smart内核即可包含基本功能,同时也可定制裁剪。rt-smart用户态应用环境采用musl libc提供POSIX接口调用及C运行环境,延续 RT-Thread 原有的生态,使用scons
2020-11-29 10:31:392426 ,是指继承UNIX的设计风格演变出来的系统。那什么是UNIX呢?UNIX操作系统(尤尼斯)是一个分时系统、多用户、多任务操作系统。Linux是一个基于POSIX和UNIX的多用户、多任务、支持多线...
2021-11-01 17:21:1211 目录简介TI-RTOSFreeRTOSPOSIX运行时对象查看器 (Runtime Object Viewer)TI-POSIX 介绍在源代码中使用 POSIXTI-POSIX支持的函数摘要线程函数
2021-12-16 16:56:465 ,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。 Linux操作系统的特点 1、Linux系统是免费的自由软件 2、良好的硬件平台
2022-01-30 17:30:002794 可移植操作系统接口,POSIX 标准定义了操作系统(很多时候针对的是类 Unix 操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性,如今主流的 Linux 系统都做
2022-04-27 10:22:121430 POSIX是什么?下图进行简单概述
2022-05-27 16:34:04675 POSIX如何定义各种功能?有哪些标准?
2022-05-27 16:42:19644 RT-Thread全球技术大会:POSIX标准定义、使用以及四种配置 审核编辑:彭静
2022-05-27 16:44:001226 可移植操作系统接口,POSIX标准定义了操作系统(很多时候针对的是类Unix操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性。如今主流的Linux系统都做到了兼容POSIX标准。
2022-05-27 16:27:401635 对于部分C函数,编译器配平层负责实现这些接口;由于RT-Thread需要维持多平台可用,所以编译器配平层的主要工作就是拟补各个编译平台的不足。
2022-05-27 16:46:371273 RT-Thread全球技术大会:RT-Thread对POSIX的实现情况介绍 审核编辑:彭静
2022-05-27 16:52:411511 在上午RT-Thread全球技术大会,RT-Thread开发者详细介绍了POSIX FILE select的调用过程。如下图:
2022-05-28 10:56:521267 exit code:代表一个进程的返回码,通过系统调用 exit_group 来触发。在 POSIX 中,0 代表正常的返回码,而 1-255 代表异常返回码,不过一般错误码都是 1。
2022-08-02 09:55:36463 本文将为您介绍关于POSIX定时器的相关知识点。因为要使用绝对时间,存在系统时间被调节的可能性,指定时间段内下发通知等需求,排除了jiffies相关的定时器、依赖于系统运行时间的定时器、alarm
2022-12-14 09:15:05622 POSIX是归属于电气与电子工程师协会(简称IEEE)的商标,是“uni-X便携式操作系统接口”的简称,其目标是通过制定一套供操作系统供应商遵循的准则来简化跨平台软件开发的任务。
2022-12-15 14:06:14288 近日,中兴通讯旗下产品——车用微内核操作系统ZTE Automotive OS V3.0正式通过POSIX规范PSE52实时控制器1003.13-2003系统(PSE52 Realtime Controller 1003.13-2003 System)认证,成为国内首家获得此认证的企业。
2022-12-15 14:06:29506 1974年,贝尔实验室正式对外发布Unix。因为涉及到反垄断等各种原因,加上早期的Unix不够完善,于是贝尔实验室以慷慨的条件向学校提供源代码,所以Unix在大专院校里获得了很多支持并得以持续发展。
2023-05-22 09:33:06491 isalnum()函数用于测试字符,如果字符是字母或数字,则返回非零值(即真),否则返回零(即假)。isalnum()函数在许多场景中非常有用,特别是在字符串处理中。
2023-09-27 11:42:40321 首先,启用 DFS:”RT-Thread Components” -> “DFS: device virtual file system” 。进入子菜单,选择
2023-10-13 10:30:32294 最近,留意到 MinIO 官方博客的一篇题为“在对象存储上实现 POSIX 访问接口是坏主意[1]”的文章,作者以 S3FS-FUSE 为例分享了通过 POSIX 方式访问 MinIO 中的数据时碰到了性能方面的困难,性能远不如直接访问 MinIO。
2023-10-29 10:19:41334 一、POSIX信号量 1.阻塞队列实现的生产消费模型代码不足的地方(无法事前得知临界资源的就绪状态) 1.在先前我们的生产消费模型代码中,一个线程如果想要操作临界资源,也就是对临界资源做修改的时候
2023-11-09 17:13:29254
评论
查看更多