嵌入式操作系统开发
学习内容:
一:多进程的优缺点
优点
1.对用户来说,操作系统讲变得更加健壮,(一个应用程序无法破坏另一个进程或操作系统)
2.对于开发着来说,更容易进行内存的读取和写入
缺点:
1.多任务实现开销比较大
2.编写能够与其他进程通信或者能够对其他进程操作的应用程序将要困难很多
二:wait函数族
1.wait函数:
将当前进程挂起,等待信号来临,再继续运行
用来等待子进程的结束
pid_t wait(intwstatus);
WEXITATUS:宏定义:返回子进程的退出状态
2.waitpid函数:
它可以指定等待的进程号
pid_t waitpid(pid_t pid, int *wstatus, int options);
3.僵尸进程:
1.zomibe
root 5760 5759 0 15:35 pts/0 00:00:00 [a.out]
top:
子进程的资源是父进程回收的
产生的原因:
当进程走完自己的生命周期之后,会执行自己的系统调用 exit(9)函数,然后内存被释放,没有执行代码。但是在进程表里仍留下进程信息(pid,退出信息),直到父进程将他们回收。
僵尸进程尽量避免
避免僵尸进程的方法:wait函数族
进程间的通信(IPC)方式:
管道:有名管道和无名管道
消息队列
信号量
共享内存
套接字
进程间通信的目的:
1.数据传输
2.共享数据:多个进程需要操作共享数据,一个进程对共享数据的修改,别的进程应该第一时间看到
3.通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如进程终止时通知父进程)
4.资源共享:多个进程之间共享的资源,为了做到这一点,需要内核提供锁和同步机制
5.进程控制:
管道通信 :无名通信:一端写,一端读
管道是半双工的,数据只能向一个方向流动,需要双方通信时,需要建立两个管道
管道的本质:单独的文件体系,这个体系只存在内核中。
必须在系统调用fork()前调用pipe()。否则子进程将不会继承文件描述符
(1)如果管道的写端不存在,则认为已经读到数据末尾,该函数返回的读出字符数为0
(2)如果管道写端不存在,如果请求的字节数目大于PIPE_BUF,则返回现有的数据字节数;如果不大于,则返回现有数据字节数,或请求字节数
有名管道
int pipe()
int mkfifo(const char *pathname,mode_t mode)
mode:
O_WRONLY(可读)
O_EDONLY(可写)
双方通信:
write:
#include "sys/types.h"
#include "sys/stat.h"
#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "sys/wait.h"
#define FIFO "./test.txt"
int main()
{
pid_t pid;
char buffer[1024];
int ret;
if((ret = mkfifo(FIFO, 0666))<0)
{
if(ret == -1 && errno == EEXIST)
{
}
else
{
perror("make mkfifo error");
exit(1);
}
}
int fd = open(FIFO,O_WRONLY);
while(1)
{
memset(buffer,0,sizeof(buffer));
scanf("%s",buffer);
write(fd,buffer,strlen(buffer));
}
return 0;
}
read:
#include "sys/types.h"
#include "sys/stat.h"
#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#define FIFO "./test.txt"
int main()
{
pid_t pid;
int ret;
char buffer[1024];
if((ret = mkfifo(FIFO,0644))<0)
{
if(ret == -1 && errno == EEXIST)
{
}
else
{
perror("make mkfifo error");
exit(0);
}
}
int fd =open(FIFO,O_RDONLY);
while(1)
{
memset(buffer,0,sizeof(buffer));
read(fd,buffer,sizeof(buffer));
printf("recv:%s\n",buffer);
sleep(2);
}
return 0;
}