武昌做网站哪家专业,运营服务商官方网站,做商城网站的公司推荐,旅游电子商务网站的建设方案i.MX8MM处理器采用了先进的14LPCFinFET工艺#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53#xff0c;单核Cortex-M4#xff0c;多达五个内核 #xff0c;主频高达1.8GHz#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…i.MX8MM处理器采用了先进的14LPCFinFET工艺提供更快的速度和更高的电源效率;四核Cortex-A53单核Cortex-M4多达五个内核 主频高达1.8GHz2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口一应俱全。H264、VP8视频硬编码H.264、H.265、VP8、VP9视频硬解码并提供相关历程,支持8路PDM接口、5路SAI接口、2路Speaker。系统支持Android9.0(支持获取root限)Linux4.14.78Qt5.10.1、Yocto、Ubuntu20、Debian9系统。适用于智能充电桩物联网工业控制医疗智能交通等可用于任何通用工业和物联网应用、 【公众号】迅为电子
【粉丝群】258811263加群获取驱动文档例程 第二部分 进程与进程间通信 第三十四章 进程基础
本章内容对应视频讲解链接在线观看
进程基本知识 → https://www.bilibili.com/video/BV1zV411e7Cy?p17 进程指正在运行的程序如下图示是资源分配的最小单位可以通过“ps ”或“top”等命令查看正在运行的进程线程是系统的最小调度单位一个进程可以拥有多个线程同一进程里的线程可以共享此进程的同一资源。 每个进程都有一个唯一的标识符即进程ID简称pid
进程间的通信的几种方法
管道通信有名管道无名管道信号通信信号的发送信号的接收信号的处理IPC通信共享内存消息队列信号灯Socket通信
进程的三种基本状态以及转换: 34.1 进程创建
本章内容对应视频讲解链接在线观看
进程控制 → https://www.bilibili.com/video/BV1zV411e7Cy?p18 所有的进程都是由其他进程创建除了pid为0号的idle进程pid号为1的init进程是系统启动后运行的第一个进程是所有进程的父进程init进程会初始化一部分系统服务创建其他进程。
创建新进程的那个进程称为父进程新进程称为子进程父进程和子进程拥有相同的代码段数据段有各自独立的地址空间。采用写时拷贝技术即创建的新进程不会立即把父进程的资源空间复制过来只有在修改时才会复制资源另外父进程挂起的信号和文件锁不会被子进程继承。
子进程结束后它的父进程要回收它的资源否则就会成为僵尸进程 。
如果父进程先结束子进程会被init进程收养称为孤儿进程。
创建进程常用函数如下定义 头文件 #include sys/types.h #include unistd.h 函数 pid_t getpid(void); 返回值 PID号 功能 获取此进程PID 头文件 #include sys/types.h #include unistd.h 函数 pid_t getppid(void); 返回值 PID号 功能 获取父进程PID 头文件 #include unistd.h 函数 pid_t fork(void); 返回值 调用成功父进程返回子进程号子进程返回0失败返回-1。 功能 系统调用创建一个进程
实验代码
代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\14”目录下。
在程序中父进程中创建一个子进程。
#include stdio.h
#include unistd.h
int main(void)
{pid_t pid;pid fork();if (pid 0){printf(fork is error \n);return -1;}//父进程if (pid 0){printf(This is parent,parent pid is %d\n, getpid());}//子进程if (pid 0){printf(This is child,child pid is %d,parent pid is %d\n, getpid(), getppid());}return 0;
}在Ubuntu上编译运行打印进程号如下图所示 34.2 exec函数族
本章内容对应视频讲解链接在线观看
exec函数族 → https://www.bilibili.com/video/BV1zV411e7Cy?p19
用fork函数创建子进程后子进程往往要调用一种exec函数以执行另一个程序该子进程被新的程序替换改变地址空间进程映像和一些属性但是pid号不变。exec函数详解如下表所示 函数 int execve(const char *filename, char *const argv[], char *const envp[]); 头文件 #include unistd.h 参数filename 路径名表示载入进程空间的新程序路径。 参数argv[] 命令行参数argv[0]为命令名 参数envp[] 新程序的环境变量 返回值 成功时不会返回使用时不用检查返回值可通过errno检查。
以下函数都是根据execve实现 int execl(const char *path, const char *arg, .../* (char *) NULL */); int execlp(const char *file, const char *arg, .../* (char *) NULL */); int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[],char *const envp[]); 实验代码
代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\15”目录下。 创建子进程子进程使用execl打印hello world。 #include stdio.h
#include unistd.h
#include stdlib.h
int main(void)
{int i0;pid_t pid;pid fork();if (pid 0){printf(fork is error \n);return -1;}//父进程if (pid 0){printf(This is parent,parent pid is %d\n, getpid());}//子进程if (pid 0){printf(This is child,child pid is %d\n, getpid(), getppid());//改为自己的路径execl(/home/samba/linux/15/hello,hello,NULL);exit(1);}i;printf(i is %d\n,i);return 0;
}编写hello.c文件内容如下所示
#include stdio.h
#include unistd.h
int main(void)
{printf(hello world\n);return 0;
}
编译hello.c如下图所示 执行结果 34.3 ps和kill命令
本章内容对应视频讲解链接在线观看
ps和kill命令 → https://www.bilibili.com/video/BV1zV411e7Cy?p20
ps命令ps命令可以列出系统中当前运行的那些进程。
命令格式ps [参数]
命令功能用来显示当前进程的状态
常用参数 aux
kill命令kill命令用来杀死进程
举例kill -9(SIGKILL) PID
进程的状态
D: 无法中断的休眠状态 (通常 IO 的进程)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
如下所示使用命令“ps aux | grep a.out”查找到./a.out的进程号为3179然后输入“kill -9 3179”结束此进程 34.4 孤儿进程与僵尸进程
本章内容对应视频讲解链接在线观看
孤儿进程和僵尸进程 → https://www.bilibili.com/video/BV1zV411e7Cy?p21 孤儿进程父进程结束以后子进程还未结束这个子进程就叫做孤儿进程。
僵尸进程子进程结束以后父进程还在运行但是父进程不去释放进程控制块这个子进程就叫做僵尸进程。
实验代码
代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\16”目录下。
在程序中创建的子进程变为孤儿进程。
#include stdio.h
#include unistd.h
#include stdlib.h
int main(void)
{int i0;pid_t pid;// 创建一个子进程pid fork();if (pid 0){printf(fork is error \n);return -1;}//父进程 让父进程先结束并打印进程PIDif (pid 0){printf(pid is %d\n, getpid());}//子进程,让子进程等待一会让父进程先结束并打印子进程的父进程的pidif (pid 0){sleep(2);printf(parent pid is %d\n, getppid());}return 0;
}
编译运行如下图所示 如上图所示子进程中打印的父进程的进程号和父进程的进程号是不一样的说明创建的子进程变成了孤儿进程此进程被系统的init进程领养了如下图所示
实验代码
在程序中子进程变为僵尸进程。
#include stdio.h
#include unistd.h
#include stdlib.h
int main(void)
{int i0;pid_t pid;// 创建一个子进程pid fork();if (pid 0){printf(fork is error \n);return -1;}//父进程 让父进程先结束并打印进程PIDif (pid 0){while(1);}//子进程,让子进程先结束if (pid 0){printf(This is child\n);exit(0);}return 0;
}
编译运行如下图所示 再打开另一个终端查看此进程如下图所示为僵尸进程。 34.5 wait()函数
本章内容对应视频讲解链接在线观看
wait函数 → https://www.bilibili.com/video/BV1zV411e7Cy?p22
wait()函数一般用在父进程中等待回收子进程的资源而防止僵尸进程的产生。 函数 pid_t wait(int *status) 头文件 #include sys/wait.h 返回值 成功返回回收的子进程的pid失败返回-1
与wait函数的参数有关的俩个宏定义 WIFEXITED(status)如果子进程正常退出则该宏定义为真 WEXITSTATUS(status)如果子进程正常退出则该宏定义的值为子进程的退出值。 实验代码
代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\17”目录下。
在程序中使用wait函数防止僵尸进程的产生。
#include stdio.h
#include unistd.h
#include stdlib.h
#include sys/wait.hint main(void)
{pid_t pid;pid fork();if(pid 0){printf(error\n);}if(pid 0){ int status;wait(status);if(WIFEXITED(status)1){printf(return value is %d\n,WEXITSTATUS(status));}while(1);}if(pid 0){sleep(2); printf(This is child\n);exit(6);}return 0;
}
编译运行如下图所示 34.6 守护进程
本章内容对应视频讲解链接在线观看
守护进程 → https://www.bilibili.com/video/BV1zV411e7Cy?p23 1.什么是守护进程
守护进程(daemon)是一类在后台运行的特殊进程用于执行特定的系统任务。很多守护进程在系统引导的时候启动并且一直运行直到系统关闭。另一些只在需要的时候才启动完成任务后就自动结束。
用户使守护进程独立于所有终端是因为在守护进程从一个终端启动的情况下这同一个终端可能被其他的用户使用。例如用户从一个终端启动守护进程后退出然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中接收到守护进程的任何错误信息。同样由终端键入的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要shell命令行以结尾即可)但用户还应该做些工作让程序本身能够自动进入后台且不依赖于任何终端。 守护进程没有控制终端因此当某些情况发生时不管是一般的报告性信息还是需由管理员处理的紧急信息都需要以某种方式输出。Syslog 函数就是输出这些信息的标准方法它把信息发送给 syslogd 守护进程。
2.怎么创建一个守护进程
有个基本要求
必须作为我们init进程的子进程不跟控制终端交互。
步骤
1.使用fork函数创建一个新的进程然后让父进程使用exit函数直接退出必须要的
2.调用setsid函数。必须要的
3.调用chdir函数将当前的工作目录改成根目录增强程序的健壮性。不是必须要的
4.重设我们umask文件掩码增强程序的健壮性和灵活性不是必须要的
5.关闭文件描述符节省资源不是必须要的
6.执行我们需要执行的代码必须要的
实验代码
代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\18”目录下。
#include stdio.h
#include unistd.h
#include stdlib.h
#include sys/wait.h
#include sys/types.h
#include sys/stat.hint main(void)
{pid_t pid;// 步骤一创建一个新的进程pid fork();//父进程直接退出if (pid 0){exit(0);}if (pid 0){// 步骤二调用setsid函数摆脱控制终端setsid();// 步骤三更改工作目录chdir(/);// 步骤四重新设置umask文件源码umask(0);// 步骤五0 1 2 三个文件描述符close(1);close(2);close(3);// 步骤六执行我们要执行的代码while (1){}}return 0;
} 运行测试如下图所示