![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
嵌入式Linux
文章平均质量分 50
(】
这个作者很懒,什么都没留下…
展开
-
进程间的通信方式简单介绍 interprocess communication(IPC)
当有一个较复杂的工作,一个进程完成不了的时候,需要多个进程共同完成,涉及到进程之间的通信,主要涉及以下四个功能数据怎么传输资源怎么共享事件互相通知进程之间的控制Linux系统下IPC早起Unix下的IPC管道:完成数据传输信号:完成时间通知功能FIFO:完成数据传输功能system-v ipc(属于Unix的分支(贝尔实验室),是在早起Unix系统不断优化得来的)system-v 消息队列:完成消息传输、进程控制功能system-v 信号量:完成资源共享、进程控制功能原创 2022-02-17 16:43:38 · 460 阅读 · 0 评论 -
僵尸进程和托孤进程
一个进程正常退出应该遵循以下步骤:子进程调用exit()函数退出进程父进程调用wait函数获取子进程的退出状态,并且把子进程占用的进程控制块销毁掉僵尸进程子进程调用了exit函数,但是父进程没有调用wait函数,没有为子进程处理“身后事”。子进程死掉了但是父进程不知道,子进程变成僵尸进程#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ pid_t result原创 2022-02-17 16:23:39 · 157 阅读 · 0 评论 -
ps命令详解
常见的扩展选项auxa:显示一个终端所有的进程u:显示进程的归属用户及内存使用情况x:显示没有关联控制终端的进程axjfj:显示进程归属的进程组id、会话id、父进程idf:以ascii的形式显示出进程的层次关系举例auxUSER:进程是哪个用户产生的PID:进程的身份证号码%CPU:指进程对CPU的占用率%MEM:进程占用内存的百分比VSZ:进程使用虚拟内存的大小RSS:进程使用物理内存的大小TTY:进程关联的终端STAT:进程当前状态原创 2022-02-17 15:53:44 · 4426 阅读 · 0 评论 -
守护 进程
会话是来管理前后台进程组,会话一般关联着一个终端。当退出这个终端,会话也随之关闭,那么会话管理的前后台进程组也会被关闭。关闭终端后会话中所有的进程组都会被关闭守护进程不受终端影响,即使关闭终端也可以继续在后台运行写一个守护进程创建一个子进程,让父进程直接退出(通过fork()函数实现)创建一个新的会话,摆脱终端影响(通过setsid()函数实现)改变守护进程当前的工作目录,在创建子进程的时候它的工作目录是继承了父进程的(通过chrdir()函数实现)重设文件权限掩码,(通过umask()原创 2022-02-17 14:53:17 · 465 阅读 · 0 评论 -
进程管理_进程组、会话、终端
1、进程组对相同类型的进程管理进程组的诞生在shell里直接执行一个应用程序,执行shell就相当于创建一个进程,顺便创建了一个进程组,对于应用程序来说,他们自己就是进程组的首进程如果进程调用了fork函数,那么父子进程同属于一个进程组,父进程是首进程在shell中通过管道执行连接起来的应用程序,两个程序同属于一个进程组,第一个程序为进程组的首进程进程组首进程作用:作为进程组的pid,叫做pgid,等于进程组首进程的pid2、会话管理进程组,主要两大类进程组:前台进程组会话的诞生调原创 2022-02-17 11:49:45 · 565 阅读 · 0 评论 -
进程生老病死
在调用fork函数时候,子进程就处于就绪态了,通过调度器切换进程之间的各种状态(来自野火Linux教学视频),这六种状态是通过宏定义的进程状态TASK_RUNNING //就绪/运行状态TASK_INTERRUPTIBLE //可中断睡眠状态TASK_UNINTERRUPTIBLE //不可可中断睡眠状态TASK_TRACED //调试态TASK_STOPPED //暂停状态EXIT_ZOMBIE //僵尸状态EXIT_DEAD //死亡态...原创 2022-02-15 12:44:13 · 242 阅读 · 0 评论 -
进程的退出
一个进程退出的时候,需要把退出状态报告给父进程,父进程通过调用wait函数会一直等待子进程退出,父进程也是用过wait函数获取子进程退出状态的wait函数头文件#include <sys/wait.h>函数原型pid_t wait(int *status)//这个形参配合宏使用返回值成功:退出子进程的pid失败:-1处理子进程退出状态的宏WIFEXITED(status),如果 子进程正常退出那么该宏为真WEXITSTATUS(status):如果子进程正常退出,该原创 2022-02-14 22:50:23 · 450 阅读 · 0 评论 -
进程 退出
exit(0)_exit(0)进程退出#include <stdio.h>#include <unistd.h>#include <stdlib.h>int main(){ pid_t result; result = fork(); if (result == -1) { printf("fork error\r\n"); } if (result == 0) { .原创 2022-02-14 22:20:04 · 271 阅读 · 0 评论 -
创建一个进程
fork函数头文件#include <unistd.h>函数原型pid_t fork(void);返回值成功:正整数失败:-1fork函数特征fork函数执行之后会返回两次,在初始进程中执行fork函数后,会创建一个新的进程,而且这个新的进程会几乎复制旧进程的所有东西,为什么是几乎呢?在执行fork函数之前操作系统只有一个进程,那fork之前的代码就只会执行一遍。调用fork函数之后,产生新进程,会把fork函数之后的代码复制一遍,所以fork之后的代码才会执行两次。原创 2022-02-14 21:35:52 · 298 阅读 · 0 评论 -
进程了解入门
首先明白程序是怎么运行的,保存在flash中的程序会被调入内存,在被执行进程通过pstree可以查看进程之间的关系,是树状的PID:进程编号,不同的应用程序有不同的PIDps -ef 查看所有进程ps -ef | more 分页显示进程...原创 2022-02-08 22:43:50 · 274 阅读 · 0 评论 -
标准IO函数
在系统IO函数中像read、write等频繁使用这些函数对磁盘频繁的读写操作会降低系统的性能,用户可以在自己的地盘开辟一块空间,当用户区存储了一定的数据量的时候在一起到内核去进行数据的读写,C标准库实现了这个缓存区。C标准库的IO函数和系统IO函数用法类似freadfwritefseekfclosefopenfflush:和sync很类似,强制将IO缓存区的数据写到页缓存区当使用标准IO编程时,buff中的内容就不能写到也缓存区...原创 2022-02-08 22:27:08 · 171 阅读 · 0 评论 -
lseek和sync函数
lseek函数功能: 设置文件读写位置头文件#include <unistd.h>函数原型/** 操作文件的文件描述符* 偏移量* 偏移量的基准点* * 所以实际的读写位置是基准点 + 偏移量的值off_t lseek(int fd, off_t offset, int whence)如果whence = SEEK_SET,基准点是文件开头如果whence = SEEK_CUR,基准点是文件当前位置如果whence = SEEK_END,基准点是文件末尾返回值原创 2022-02-08 22:03:41 · 410 阅读 · 0 评论 -
read_write函数
read 函数包含头文件#include <unistd.h>函数原型/** 文件描述符* 想要读取文件内容的buffer地址* 要读取的文件字节数量*/ssize_t read(int fd, void* buff, size_t count);返回值count:成功读取全部字节0~count:说明要读取的文件数小于count字节数,或者在读取期间被异步信号打断-1:失败write函数包含头文件同read函数函数原型/** 文件描述符* 想要原创 2022-01-18 22:46:50 · 513 阅读 · 0 评论 -
open_close函数
open头文件使用open函数需要包含#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>函数原型当文件存在时int open(const char* pathname, int flags)当文件不存在时int open(const char* pathname, int flags, int perms)返回值成功:文件描述符失败:-1close头文原创 2022-01-17 23:07:01 · 664 阅读 · 0 评论 -
系统/标准IO编程
系统IO编程open:打开文件write:写文件read:读文件lseek:设置文件读写位置close:关闭文件伪代码:int fd; //定义一个文件描述符/*文件名, 打开文件的模式, 设置文件权限*/fd = open(filename, flag, mode); //打开文件,会返回一个文件描述符/*文件描述符, 读写位置的偏移量, 文件读写位置的基准值*/lseek(fd, offset, whence);//设置好这个才能对文件进行读写操作/*文件描述符,写入文件的内原创 2022-01-12 21:58:42 · 154 阅读 · 0 评论 -
Linux,一切皆文件
Linux内核屏蔽硬件区别,把所有的硬件设备抽象成文件,提供统一的接口供用户使用,这就涉及到虚拟文件系统虚拟文件系统抽象层,对文件的访问实际上是对抽象层的访问,虚拟文件系统包括几个抽象对象,抽象对象就封装了底层的读写细节,使用C语言的多态实现具体文件系统的读写接口虚拟文件系统比较重要的抽象对象(VFS,virtual file system)super_block:表示具体的文件系统,当系统中增加新的文件系统的时候,就需要增加一个super_block对象来管理文件系统inode:具体的文件i原创 2022-01-11 22:06:15 · 244 阅读 · 0 评论 -
Makefile语法+简单应用
make工具make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,然后单独编译这些文件Makefile文件:记录依赖关系和编译规则Makefile三要素:目标、依赖、命令目标:依赖文件或者其他文件 命令1 命令2 命令3使用make命令之后,到当前目录寻找Makefile文件,然后找到第一个要执行的目标,由于targeta依赖于targetb和targetc,所以先去执行b、c目标对应的命令,等到targeta依赖目标命令执行完之后才能执行targetamake + 目标:原创 2022-01-10 22:39:13 · 478 阅读 · 0 评论 -
本地编译与交叉编译
比如在X86架构的PC机上编译一个程序,在X86平台运行,这就叫本地编译在X86架构编译在ARM平台运行,这就叫交叉编译(单片机)一句话:编译工具链与目标程序的运行是否在相同的架构平台有本地编译为什么还要交叉编译?编译程序是很复杂的工作,对CPU的运算能力要求较高,需要较大的磁盘空间。对于常用的ARM平台,满足不了安装编译器的条件,特别是MCU(单片机),根本就没办法安装编译器,只能用PC机去编译。ARM-GCC和GCCARM-GCC针对ARM平台的一款编译器,它只是GCC编译器的一个分支。寻原创 2022-01-05 22:29:35 · 1341 阅读 · 0 评论 -
helloWord执行过程
GCC由来是由GNU组织编写,对抗商业收费的软件GCC编译工具链C语言整个编译过程可以分为四个阶段预处理阶段、编译阶段——GCC编译器汇编阶段、链接阶段——binutils工具链运行helloWordgcc helloword.c -o hellohello.c 的文件执行变为hello.i的文件(hello.c预处理之后的文件,头文件包含,条件编译、宏定义等)hello.i编译成hello.s的文件(hello.s是汇编文件。通过词法分析、语法分析就能编译成汇编文件了)hell原创 2021-12-28 18:38:32 · 661 阅读 · 0 评论 -
shell基本语法
变量赋值首先使用shell变量要指定一个解析器一般默认为跟目录下的bin下的bash,用$符号使用这个变量三种情况:只适用于没有空格或者制表符的时候var=123适用于不连续的字符,单引号所见即所得var='123 789'适用于不连续的字符,以及可以使用$符使用这个变量var="123"在使用$符解出变量时,最好加上大括号 $ {……}命令赋值给变量1、打印命令使用反引号var=`pwd`echo "$var"$符+()var=$(pw原创 2021-12-21 22:37:30 · 276 阅读 · 0 评论 -
Linux命令
shell是什么shell就是一个Linux系统的应用程序,是用户和Linux内核沟通的桥梁。对外接受用户输入的命令对内通过系统调用传递给内核运行最后呈现出运行结果shell操作以键盘为主,需要记住各种命令Linux常用命令查询命令man printf //告诉你一个尽可能详细的命令用法cd -- help //告诉你主要的命令用法目录操作类cd / //进入根目录cd ~ //进入家目录pwd //打印当前目录ls //列出当前目录下的文件,ls -a //打印出所原创 2021-12-12 22:38:17 · 296 阅读 · 0 评论 -
Linux用户管理与文件权限
(1)’ / ’ Linux根目录:Linux所有的目录都是挂在在根目录之下的用户和用户组:UID和GID(用户和用户组的标识)当打开Linux系统,输入密码,** 按下登录那一刻 就会去 /etc /passwd 目录下找到对应的UID,然后去 /etc /group目录找到GID 。如果说系统既能够找到UID也能找到GID ,那么这个用户就是个合法存在的用户,最后就去 /etc /shadow下在按照用户名找到对应的密码 **①在 /etc /passwd中保存了如下格式的内容:用户名:密码(x原创 2021-04-29 19:48:55 · 45 阅读 · 0 评论