
进程和线程
文章平均质量分 85
嵌入式的大菜鸟
心之所向,不慌不忙
展开
-
项目实战:基于Linux的Flappy bird游戏开发
Ncurses是最早的System V Release 4.0 (SVr4)中 curses的一个克隆和升级。这是一个可自由配置的库,完全兼容旧版本curses。Ncurses构成了一个工作在底层终端代码之上的封装,并向用户提供了一个灵活高效的API(Application Programming Interface 应用程序接口)。它提供了创建窗口界面,移动光标,产生颜色,处理键盘按键等功能。使程序员编写应用程序不需要关心那些底层的终端操作。简而言之,它是一个管理应用程序在字符终端显示的函数库。原创 2024-11-02 09:36:27 · 1359 阅读 · 0 评论 -
信号灯/信号量(semaphore)
如果至少有一个线程阻塞在该 sem上,表示有线程等待资源,信号量为 0,这时该函数保持信号量为 0 不变,并使某个阻塞在该 sem 上的线程从 sem_wait 函数中返回。释放资源,如果没有线程阻塞在该 sem 上,表示没有线程等待该资源,这时该函数就对信。获取资源,如果信号量为 0,表示这时没有相应资源空闲,那么调用线程就将挂起,直到有。参数:key:ftok 产生的 key 值(和信号灯关联的 key 值)SETVAL:设置信号灯的值,需要用到第四个参数:共用体。mode:文件权限。原创 2024-11-01 19:30:13 · 939 阅读 · 0 评论 -
深入探索共享内存
通过映射共享内存到各个进程的地址空间,进程可以直接访问共享数据,避免了复制和消息传递的开销,适用于需要高性能和低延迟的应用场景。:如果一个进程附加(attach)了共享内存但没有显式分离(detach),通常在进程终止时,操作系统会自动将共享内存从进程的地址空间中分离(detach),但不会删除共享内存本身。其他进程仍然可以访问这块共享内存。:主要是对实时数据传输的要求场合,在需要高实时性的系统中,如工业控制系统、航空航天系统,共享内存用于快速传输传感器数据、控制指令等,以实现及时的反应和处理。原创 2024-10-31 09:09:09 · 878 阅读 · 0 评论 -
消息队列的使用
cmd 要执行的操作 IPC_STAT / IPC_SET / IPC_RMID(删除)MSG_EXCEPT:与msgtype配合使用返回队列中第一个类型不为msgtype的消息。IPC_NOWAIT:如果没有返回条件的消息调用立即返回,此时错误码为ENOMSG。IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回。1 消息结构必须有long类型的msg_type字段,表示消息的类型。msgtype>0:收到的第一条 msg_type类型的消息。原创 2024-10-31 09:02:12 · 913 阅读 · 0 评论 -
信号机制下(阻塞、信号集、信号驱动任务)
有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。信号的”阻塞“是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。SIG_BLOCK : 把参数set中的信号添加到信号屏蔽字中。SIG_UNBLOCK: 从信号屏蔽字中删除参数set中的信号。SIG_SETMASK: 把信号屏蔽字设置为参数set中的信号。首先,若oset是非空指针,那么进程的当前信号屏蔽字通过oset返回。原创 2024-10-31 08:39:30 · 344 阅读 · 0 评论 -
信号机制上(信号概念、发送、定时器、信号捕捉、SIGCHLD)
0:发送信号给跟调用kill函数的那个进程处于同一进程组的进程。< -1: 取绝对值,发送信号给该绝对值所对应的进程组的所有组员。sa_sigaction: 另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。= -1:发送信号给,有权限发送的所有进程。使用signal/sigaction 函数,把自定义的handle和指定的信号相关联。SA_RESTART:使被信号打断的系统调用自动重新发起。原创 2024-10-30 17:08:16 · 882 阅读 · 0 评论 -
共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)
创建共享内存映射成功返回创建的映射区首地址,失败返回MAP_FAILED( ((void *) -1) ),设置errno值addr:指定要映射的内存地址,一般设置为 NULL 让操作系统自动选择合适的内存地址。length:必须>0。映射地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。prot:指定共享内存的访问权限。可取如下几个值的可选:PROT_READ(可读), PROT_WRITE(可写), PROT_EXEC(可执行), PROT_NONE(不可访问)。原创 2024-10-30 17:00:00 · 1067 阅读 · 0 评论 -
有名管道和无名管道
4.对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY | O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。2.管道通信是单工的,一端读,一端写(程序实现设计好)。3. 管道已满,write阻塞。原创 2024-10-29 15:25:43 · 628 阅读 · 0 评论 -
线程池及gdb调试多线程
我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间,当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。概念:通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。1 任务队列,存储需要处理的任务,由工作线程来处理这些任务。判断是否有空闲的工作线程。原创 2024-10-29 15:21:03 · 736 阅读 · 0 评论 -
条件变量基本使用
2、如果pthread_cond_signal或者pthread_cond_broadcast 早于 pthread_cond_wait ,则有可能会丢失信号。1、pthread_cond_wait(&cond, &mutex),在没有资源等待是是先unlock 休眠,等资源到了,再lock。所以pthread_cond_wait he pthread_mutex_lock 必须配对使用。原创 2024-10-29 13:37:26 · 382 阅读 · 0 评论 -
线程的取消和互斥
在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。原创 2024-10-29 10:36:16 · 420 阅读 · 0 评论 -
线程的取消和清理
4.线程内的return 可以结束线程,也可以给pthread_join返回值,但不能触发pthread_cleanup_push里面的回调函数,所以我们结束线程尽量使用pthread_exit退出线程。2.pthread_cleanup_pop()被执行且参数为0,pthread_cleanup_push回调函数routine不会被执行.3.pthread_cleanup_push 和pthread_cleanup_pop可以写多对,routine执行顺序正好相反。输入命令bt(打印调用栈)原创 2024-10-29 10:27:21 · 363 阅读 · 0 评论 -
线程的回收及内存演示
*通过线程属性来设置游离态(分离态)*/int pthread_detach(pthread_t thread);–指定该状态,线程主动与主控线程断开关系。注意:pthread_join 是阻塞函数,如果回收的线程没有结束,则一直等待。错误类型:参数不匹配,期望的是char * ,但参数retv是void *解决:在参数前面加强制类型转换(char*)retv。错误可能:1拼写错误,2对应的头文件没有包含。错误类型:未知的类型pthead_t。原创 2024-10-29 08:47:26 · 307 阅读 · 0 评论 -
线程的创建和参数传递
意义:表示pthread_create参数3的定义和实际代码不符合,期望的是void * (*)(void *) ,实际的代码是int * (*)(char *)collect2: error: ld returned 1 exit status --------这个链接错误,使用多线程的好处:大大提高了任务切换的效率,避免了额外的TLB & cache的刷新。arg 传递给routine的参数 ,参数是void * ,注意传递参数格式,注意事项:1. 主进程的退出,它创建的线程也会退出。原创 2024-10-29 08:41:26 · 982 阅读 · 0 评论 -
exec函数族和进程
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。1、背景:fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望 ,父子进程执行不同的代码。成功:返回调用进程的会话ID;原创 2024-10-28 19:16:13 · 592 阅读 · 0 评论 -
进程的创建和回收
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。pid原创 2024-10-28 18:57:39 · 892 阅读 · 0 评论