嵌入式 Linux进程间通信(一)——进程

嵌入式 Linux进程间通信(一)——进程

进程是程序的实例化,是运行中的程序。程序在编译时用链接器,运行时用加载器。进程运行在虚拟地址空间,操作系统中每个进程在独立的地址空间中运行,每个进程的而逻辑地址空间均为4GB(32位系统),0-1G位OS,1G-4G为应用。

每个进程都有一个在操作系统内唯一的进程号,进程号的获取函数有:

#include <sys/types.h>

#include <unistd.h>

pid_t getpid(void);//返回当前运行进程的而进程ID

pid_t getppid(void);//返回当前运行进程的父进程的ID

uid_t getuid(void);//返回当前运行进程的用户ID

uid_t geteuid(void);//返回当前运行进程的有效用户ID

gid_t getgid(void);//返回当前运行进程的组ID

gid_t getegid(void);//返回当前运行进程的有效组ID

当设置-用户-ID(SUID)位设置,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了设置-用户组-ID(SGID)位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。linux系统通过进程的有效用户ID和有效用户组ID来决定进程对系统资源的访问权限。

一、进程的创建

#include <unistd.h>

pid_t fork(void);

以复制当前运行进程的方式创建一个新进程,新的进程作为子进程。

成功,在父进程中返回子进程的PID,在子进程中返回0,子进程创建失败则在父进程中返回-1,设置errno。

#include <sys/types.h>

#include <unistd.h>

pid_t vfork(void);

Vfork与fork一样,用来创建一个新进程,但不复制父进程的页表。

二、父子进程对文件的操作

子进程继承父进程中打开的文件,父子进程对文件的操作是接续写。父进程和子进程分别打开文件,父进程和子进程对文件的操作是分别写,即父子进程对文件的读写会相互覆盖。如果父进程先运行,则子进程会覆盖父进程对文件的操作,O_APPEND可以将父子进程分别打开的文件的文件指针关联,实现接续写。

三、进程的结束

进程运行时需要占用系统资源,进程结束时需要释放系统资源。进程退出时,操作系统会自动回收进程占用的系统资源。但父进程分配给进程本身占用的8KB内存(task_struct和栈)不能被操作系统回收。

#include <stdlib.h>

int atexit(void (*function)(void));

注册一个在进程正常中止时调用的函数,成功返回0,失败返回非0

注册多个函数时,先注册的函数后执行,后注册的函数先执行。

进程正常中止:return,exit,_exit(不执行atexit注册的函数)

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

WIFEXITED(status) 子进程正常终止则返回1

WIFSIGNALED(status)子进程由信号终止则返回1

WTERMSIG(status)返回触发子进程终止的信号的号码

wait工作原理:

A、子进程结束时系统向父进程发送一个SIGCHILD信号

B、父进程调用wait函数后阻塞

C、父进程被SIGCHILD信号唤醒然后去回收僵尸子进程

D、如果父进程没有任何子进程则wait返回错误

Wait函数用于等待当前进程的子进程的状态变化,包括子进程终止,子进程被信号停止,子进程被信号唤醒,在子进程终止的情况下,会释放与子进程相关的资源,但子进程处于僵尸状态则不会释放。

Waitpid可以回收指定PID的子进程,有阻塞和非阻塞模式。

时间: 2024-12-23 18:22:59

嵌入式 Linux进程间通信(一)——进程的相关文章

嵌入式 Linux进程间通信(三)——守护进程

嵌入式 Linux进程间通信(三)--守护进程 一.守护进程简介 1.守护进程简介 守护进程(Daemon)是运行在后台.独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件的一种特殊进程.守护进程常常在系统引导装入时启动,在系统关闭时终止.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务.比如,作业规划进程crond等.守护进程的创建本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同

嵌入式 Linux进程间通信(十二)——多线程同步

嵌入式 Linux进程间通信(十二)--多线程同步 多线程编程中有三种线程同步机制:互斥锁.信号量.条件量.本文将使用生产者消费者问题编程实践三种线程同步方式. 生产者.消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 一.互斥锁

嵌入式 Linux进程间通信(二)——exec族函数

嵌入式 Linux进程间通信(二)--exec族函数 exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件.这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件. exec族函数包含如下函数: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int exec

嵌入式 Linux进程间通信(五)——进程间通信简介

嵌入式 Linux进程间通信(五)--进程间通信简介 一.进程间通信简介 Linux的进程通信方式基本上是从Unix平台上的进程通信方式继承而来的.在Unix发展过程中,贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)是Unix发展的主要贡献者,但两者在进程间通信方面的侧重点有所不同.贝尔实验室对Unix早期的进程间通信方式进行了系统的改进和扩充,形成了 "system V IPC",通信进程局限在本地计算机内:BSD则跳过了进程通信局限在本地计算机的限制,形成了可以在计算

嵌入式 Linux进程间通信(六)——管道

嵌入式 Linux进程间通信(六)--管道 一.管道 管道是单向的.先进先出的.无结构的.固定大小的字节流.写进程在管道的尾端写入数据,读进程在管道的首端读出数据.数据读出后将从管道中移走,其它读进程都不能再读到这些数据.管道提供了简单的流控制机制.进程试图读空管道时,在有数据写入管道前,进程将一直阻塞:管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞.管道存在于系统内核之中,管道只能用于具有亲缘关系进程间的通信.管道是半双工的,数据只能向一个方向流动:需要双方通

嵌入式 Linux进程间通信(七)——消息队列

嵌入式 Linux进程间通信(七)--消息队列 一.消息队列 消息队列用于同一台机器上的进程间通信,是一个在系统内核中用来保存消息的队列,在系统内核中是以消息链表的形式出现.消息链表中节点的结构用msg声明.消息队列是一种从一个进程向另一个进程发送数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.消息队列可以避免命名管道的同步和阻塞问题,但是每个数据块都有一个最大长度的限制. 1.msgget函数 #include <sys/types.h> #in

嵌入式 Linux进程间通信(四)——Linux系统日志

嵌入式 Linux进程间通信(四)--Linux系统日志 syslog 是一种工业标准的协议,用来记录设备的日志.Linux日志系统由系统日志监控程序syslogd和内核日志监控程序klogd组成,两个监控程序都是守护程序(daemon),且都注册成了系统服务.syslogd专门记录非内核的其他设备所产生的日志,当系统的控制权由系统交给init的时候,日志信息的记录由syslogd负责记录.Klogd主要负责内核所产生的日志.内核日志记录信息由dmesg /var/log/dmesg查看. 常见

嵌入式 Linux进程间通信(八)——共享内存

嵌入式 Linux进程间通信(八)--共享内存 一.共享内存 共享内存允许两个或更多进程共享给定的内存区,数据不需要在不同进程间进行复制,是最快的进程间通信方式.使用共享内存唯一需要注意的是多个进程之间对给定存储区的同步访问,但共享内存本身没有提供同步机制,通常使用信号量来实现对共享内存访问的同步. 共享内存编程流程:创建共享内存.映射共享内存.使用共享内存.撤销映射操作.删除共享内存 1.创建共享内存 #include <sys/ipc.h> #include <sys/shm.h&g

嵌入式 Linux进程间通信(十一)——多线程简介

嵌入式 Linux进程间通信(十一)--多线程简介 一.线程简介 线程有四种:内核线程.轻量级进程.用户线程.加强版用户线程 1.内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间.支持多线程的内核叫做多线程内核(Multi-Threads kernel ). 2.轻量级进程LWP 轻量级进程(LWP)是一种由内核支持的用户线程,是基于内核线程的高级抽象,只有先支持内核线程,才能有轻量级进程LWP.每一个