嵌入式开发(三):Linux知识点—Linux进程编程

姓名:王芷若    学号:19020100180

学院:电子工程学院

转载自:https://blog.csdn.net/weixin_44039347/article/details/91606727?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

【嵌牛导读】:本篇文章整理Linux知识点—arm-Linux进程编程。进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配和调度的基本单位,是操作系统结构的基础。

【嵌牛鼻子】:Linux进程编程,fork()函数语法

【嵌牛提问】:Linux进程编程是什么逻辑,如何进行的呢?

【嵌牛内容】

Linux进程编程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配和调度的基本单位,是操作系统结构的基础。

1 进程控制

子进程创建:fork()函数

在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。

1)fork()函数说明

fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。

使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程的上下文、代码段、进程堆栈、内存信息、打开的文件描述符、符号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。

因为子进程几乎是父进程的完全复制,所以父子两进程会运行同一个程序。这就需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。

实际上是在父进程中执行fork()函数时,父进程会复制一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得所属fork()函数的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判断该进程的父进程还是子进程。

2)fork()函数语法

进程等待函数

1)wait()函数,无条件等待,父进程阻塞直到子进程结束

2)waitpid()函数,指定等待某个子进程结束以及等待的方式(阻塞或非阻塞)

所需头文件 #include

#include

函数原型 pid_t waitpid(pid_t pid, int *status, int options)

函数参数 pid pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。

pid=-1:等待任何一个子进程退出,此时和wait作用一样。

pid=0:等待其组ID等于调用进程的组ID的任一子进程。

pid<-1:等待其组ID等于pid的绝对值的任一子进程。

status 同wait

options WNOHANG:若由pid指定的子进程并不立即可用,则waitpid不阻塞,此时返回值为0

WUNTRACED:若某实现支持作业控制,则由pid指定的任一子进程状态已暂停,且其状态自暂停以来还未报告过,则返回其状态。

0:同wait,阻塞父进程,等待子进程退出。

函数返回值 正常:结束的子进程的进程号

使用选项WNOHANG且没有子进程结束时:0

调用出错:-1

进程结束:exit()和_exit()

所需头文件 exit:#include

_exit:#include

函数原型 exit:void exit(int status);

_exit:void _exit(int status);

函数传入值 status是一个整型的参数,可以利用这个参数传递进程结束时的状态。

通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。

在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的

处理。

两者的区别:

(1)_exit()函数的作用最为简单:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;

(2)exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。

(3)exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是"清理I/O缓冲"。

Linux下的进程间通信

进程间通信用于实现参数传递及通信功能;Linux支持的常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口等等。

你可能感兴趣的:(嵌入式开发(三):Linux知识点—Linux进程编程)