系统编程
定期更新Linux进程、线程、管道、信号、消息队列、共享内存、信号量、线程池等知识和习题,带你成为嵌入式大佬。
邢仕冲的一亩三分地
工作:目前从事毫米波雷达的嵌入式开发,关注我和你一起从菜鸟走向车载毫米波雷达乃至自动驾驶的技术大牛。
展开
-
Linux---线程读写锁详解及代码实现
一、读写锁原理 在实际问题中,互斥锁可以解决大部分互斥的问题,保证资源可以被独占式使用,但是有时候互斥锁可能会导致效率降低。比如:系统中有成千上万条线程对同一资源进行访问,其中绝大部分是对其进行读取,只有少部分线程需要对其进行写入,这样使用互斥锁效率就会很低,所以使用读写锁。读锁:获取数据( read、printf、fread、fget、get、getchar、scanf),当一个线程上了读锁,其他线程可以一直上读锁。写锁:修改数据(write、puts、fwrite、fputs、putchar)当原创 2021-09-07 09:49:15 · 679 阅读 · 0 评论 -
linux---线程互斥锁总结及代码实现
一、互斥锁的基本概念 进程中的线程在使用某一临界资源时,为了保证临界资源在某一时刻只能被一个任务使用,约定:在使用临界资源之前,都要对临界资源上锁(上锁过程会被堵塞),然后再使用这个资源,用完之后解锁。二、互斥锁相关API1、互斥锁初始化int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex‐attr_t *mutexattr);mutex:互斥锁变量的地址mutexarr:互斥锁属性变量的地址 NULL原创 2021-09-06 20:32:27 · 680 阅读 · 0 评论 -
Linux线程总结---线程的创建、退出、取消、回收、分离属性
一、线程的基本概念1、基本概念线程是特殊的进程,在操作系统中,线程不能独立存在,线程是进程创建出来的,一个进程可以有多个线程,进程退出了,线程也会跟着退出。2、资源每个进程都有自己独立的堆、栈、数据段、代码段等空间,线程基本没有独立的资源,只有必不可少的资源(栈),同一进程之间的线程共享进程中的所有资源。二、线程相关的API1、线程创建函数thread:存放线程的idattr:线程的分离属性—>NULLstart_routine :参数为void *, 返回值也是void * 类型原创 2021-09-06 20:11:24 · 1414 阅读 · 0 评论 -
消息队列创建和通信
消息队列,信号量,共享内存通称为system-V IPC,在系统中他们都是用一种名为key的键值来做唯一标识,他们被创建后,不会因为进程的退出而消失,而会持续的存在,除非调用特殊的函数或命令删除。ftok函数1)pathname:在一个项目里面,所有进程都在同一路径里面,pathname指的是一个路径。2)proj_id:IPC的标识,表示key值当路径和IPC的标识都一样时,创建出来的key值是一样的。key的作用:申请对应传输机制的空间资源和确定传输机制消息队列:消息队列需要的空间,确定原创 2021-09-01 17:30:18 · 196 阅读 · 0 评论 -
有名管道---实现两个人之间相互通信
**方法一:**使用两个管道实现两个.c文件,本文只提供了一个.c另一个.c文件copy过去父子进程的收发交换一下即可。代码:#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <sys/wait.h>#inc原创 2021-09-01 11:18:11 · 281 阅读 · 0 评论 -
无名管道-----实现父子进程相互通信
创建一条无名管道并且给你两个文件描述符(读写的文件描述符)pipefd[0]:读端pipefd[1]:写端思路:只需要一个.c即可,fork一次即可(因为用的是无名管道)注意:父进程:发:scanf + write //你好我是旦丁收:read + printf //卡住子进程:发:scanf《卡》 + write “我不是旦丁”收:read《卡》 + printf#include <stdio.h>#include <errno.h>#inc原创 2021-09-01 10:01:03 · 4076 阅读 · 2 评论 -
无名管道&&有名管道详解代码
管道是一种文件,无名管道:1)没有名字的文件,没有在磁盘里面形成具体的文件2)不能用lseek定位3)退出程序后,程序内部的管道资源会被释放,下次运行需要在创建,才能使用4)只能用在亲缘进程(父子,爷孙,兄弟)5)pipe实在fork之前创建的(4个读写端口,两个读两个写,才能够实现亲缘进程双向通信)6)无名管道是在内核空间创建出来的。7)半双工通信(读端只能读,不能写)8)无名管道不能用open打开9)写操作没有原子性。(不能给他一个多进程的环境,只能进程单一的通信)原子性(多线程操原创 2021-08-31 13:03:12 · 502 阅读 · 0 评论 -
使用信号集,验证可靠信号挨个排队响应和不可靠信号会丢失的特点
可靠信号:(34-64)如果多个进程同时给一个进程发信号,会排队,依次从大到小依次响应。(没有默认触发机制)不可靠信号(1-31)会丢失验证代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/wait.h>#include <sys/types.h>#include <unistd.h>#include <errno.h原创 2021-08-30 19:13:33 · 123 阅读 · 0 评论 -
信号外带数据---sigaction()函数和sigqueue()函数的使用
sigaction:接收、捕捉(预设值接收)这个结构体的中sa_flag要设置为:SA_SIGINFO,才能使用使用拓展信号响应函数标准信号响应函数:typedef void (*sighandler_t)(int);拓展信号响应函数:void (*sa_sigaction)(int, siginfo_t *, void *);sa_sigaction赋值为你要的信号响应函数的地址sigqueue(发送)该函数的第三个参数:联合体分析(不难推出,这个联合体就是存放你要外带的数据)代码:原创 2021-08-30 16:04:29 · 269 阅读 · 0 评论 -
vfork()函数详解
vforkvfork的特点 — 创建子进程:①子进程必定先运行,等到子进程调用exit或者exec后,父进程才能运行②父子进程共享空间(共享内存数据)fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中。父子进程谁先运行是随机的。代码:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <errno原创 2021-08-30 14:04:47 · 1314 阅读 · 0 评论 -
让“父进程”可以有自己的工作,不需要因为为了“子进程”回收资源而堵塞。但也要满足“子进程”退出后的资源能被立马回收。(不能使用任何的进程通信机制 比如:信号等)
题目:让“父进程”可以有自己的工作,不需要因为为了“子进程”回收资源而堵塞。但也要满足“子进程”退出后的资源能被立马回收。(不能使用任何的进程通信机制 比如:信号等)方法:fork两次代码:#include <stdio.h>#include <signal.h>#include <errno.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>原创 2021-08-30 12:44:04 · 137 阅读 · 0 评论 -
Linux如何创建进程扇和进程链
所谓进程链就是父进程创建一个子进程,创建的子进程再次创建出属于自己的子进程,这样依次往下循环,如下图所示。所谓的进程扇就是一个父进程创建出多个子进程,如下图所示。代码:创建进程扇:#include <stdio.h>#include <errno.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#d原创 2021-08-27 10:00:36 · 521 阅读 · 2 评论