IT技术互动交流平台

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

作者:佚名  来源:IT165收集  发布日期:2016-07-18 20:35:23

进程是程序的实例化,是运行中的程序。程序在编译时用链接器,运行时用加载器。进程运行在虚拟地址空间,操作系统中每个进程在独立的地址空间中运行,每个进程的而逻辑地址空间均为4GB(32位系统),0-1G位OS,1G-4G为应用。
    每个进程都有一个在操作系统内唯一的进程号,进程号的获取函数有:
#include
#include
 
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
 
pid_t fork(void);
    以复制当前运行进程的方式创建一个新进程,新的进程作为子进程。
    成功,在父进程中返回子进程的PID,在子进程中返回0,子进程创建失败则在父进程中返回-1,设置errno。
#include
#include
 
pid_t vfork(void);
Vfork与fork一样,用来创建一个新进程,但不复制父进程的页表。
二、父子进程对文件的操作
    子进程继承父进程中打开的文件,父子进程对文件的操作是接续写。父进程和子进程分别打开文件,父进程和子进程对文件的操作是分别写,即父子进程对文件的读写会相互覆盖。如果父进程先运行,则子进程会覆盖父进程对文件的操作,O_APPEND可以将父子进程分别打开的文件的文件指针关联,实现接续写。
三、进程的结束
    进程运行时需要占用系统资源,进程结束时需要释放系统资源。进程退出时,操作系统会自动回收进程占用的系统资源。但父进程分配给进程本身占用的8KB内存(task_struct和栈)不能被操作系统回收。
#include
 
int atexit(void (*function)(void));
注册一个在进程正常中止时调用的函数,成功返回0,失败返回非0
注册多个函数时,先注册的函数后执行,后注册的函数先执行。
进程正常中止:return,exit,_exit(不执行atexit注册的函数)
 
#include
#include
 
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的子进程,有阻塞和非阻塞模式。
 

Tag标签: 进程   嵌入式  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规