linux高级编程(五、进程)
(6页)
本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!
19.90 积分
/ 第五天 进程 // 三、进程 (一)进程的基本概念程序:代码,一个普通二制流的文件,里面都是指令。进程:是处于运行状态的程序,是程序执行过程,是运行的程序。一个源程序经过编译、链接后,成为一个可执行的程序,当可执行程序被系统加 载到内存空间运行时就称为进程。同一个程序可以有多个进程,每一个进程都有自已的 PID线程:是独立指令流,是运行的代码段。是进程的一部分,在一个进程中可以有多个线 程。进程组:linux 系统中,每个进程都唯一归属于某个进程组,在 shell 环境中,一条 linux 指令就形成一个进程组,一个进程组可以有多个进程。进程会话:用户登陆一个新的 shell 环境,一个新的会话就产生了,一个会话可以包括 若干个进程组。这些进程组只能有一个前台进程组,其它进程组为后台运行进程组 1.进程属性进程创建后,系统内核为其分配了一系列的数据结构。这些数据结构中保存了进程的相 关属性,如下内容:ps -Alef 查看所有进程ps -alef 查看当前终端进程F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD4 S 0 1 0 0 78 0 - 518 - ? 00:00:01 initUID 进程用户标识PID 进程的标识符,进程创建时,内核为进程分配的唯一标识 IDPPID 进程的父标识符,linux 下全部进程组成一棵进程树,树根进程是 0 号进程 swapper,除根进程外,每个进程都有其对应的父进程STIME 进程状态,wait 等待状态,-运行状态2.进程的内存映像地址由高到低命令行参数栈:栈存放珵序局部变量,函数参数、函数返回值堆:堆的大小不固定,可根据程序运行过程中的要求动态变化BBS 段:程序未初始化的全局变量数据段:数来存放程序已初始化的全局变量、静态变量等代码段:可执行程序在内存中的映像,代码段是只读的,存放可执行文件指令3.进程的启动手动启动(加载)前台:目录/程序名 程序运行于终端前台,终端不能做其它操作后台:目录/程序名 name 环境变量名返回值 成功 环境变量值 失败 NULL(未定义环境变量)2)设置环境变量int putenv(char *string);string 要设置的环境变量串,其格式为“环境变量名=值“返回值 成功 0 失败 -1例:#include #include int main(){char *buffer;buffer = getenv (“CONFIG_PATH“);if(buffer==NULL) {putenv(“CONFIG_PATH=/etc“);}printf(“CONFIG_PATH=%s\n“,getenv(“CONFIG_PATH“));return 0;}7.获取进程标识符函数同一个程序可以有多个进程,每一个进程都有自已的 PIDpid_t getpid() //获取进程 PIDpid_t getppid() //获取进程的父进程 IDpid_t getpgrp() //获取进程组 ID例://---------------下午-------------------------------- (二)进程的创建与终止 1.创建子进程#include #include pid_t fork();返回值:父进程和子进程 ID,失败 -1fork 调用一次将返回两次,分别在父进程和子进程返回。在父进程中,返回值为子进程的进程标识符。在子进程中,返回值为 0fork 调用成功后,将由一个进程产生两个进程,各占独自的内存空间。同时运行父进程 和子进程。创建子进程时,把原来所有的资源复制了一份,做为子进程的资源。子进程复制了父进 程的数据段包括全局变量,但父子进程各有一份全局变量的拷贝。 所有各占独自的内存,因此不能通过全局变量在父子进程间通信。子进程继承了父进程的所有资源,包括用户 ID、用户组 ID、有效用户 ID、有效用户组 ID、进程组 ID、文件创建掩码和环境变量等。2.退出进程void exit(int status); //先检查文件是否被打开,把文件缓冲区内的数据写入文件,然后终 止进程void _exit(int status);//是直接终止进程,把退出地进程内存释放status:是进程结束后的返回值3. 等待进程结束#include pid_t wait(int *status); //是阻塞方式pid_t wait(pid_t pid,int *status,int options); //根据 options 确定是否阻塞status:在此处获取的进程结束时的返回值,进程返回值的指针,前 8 位是子进程的返回 值,后 8 位是操作系占用的位pid :指定等待哪一个进程返回的值options:等待返回信息的方式WNOHANG 不阻塞模式WUNTRACED 阻塞,只要进程暂停就返回状态0 阻塞方式等待例:pid_t pid=fork();int value;if (pid==-1){printf(“fork err\n“);exit(0);}if (pid==0){//子进程printf(“son------- pid =%d\n“,getpid());sleep(3);exit(65);}else {wait(printf(“father ---- %d\n“,value >> 8);printf(“father ---- %d\n“,value }return 0;例:pid_t pid=fork();int value;if (pid==-1){printf(“fork err\n“);exit(0);}if (pid==0){//子进程printf(“son------- pid =%d\n“,getpid());sleep(3);exit(65);}else {//wait(do{pid=waitpid(pid,printf(“father ---- %d\n“,value >> 8);printf(“father ---- %d\n“,value sleep(1);}while(pid==0);}(三)其它创建进程的方式创建子进程有三种方式:fork、exec、system 1.调用外部程序int system(char *command);command:要加载的外部程序调用返回值:-1 或 127 执行失败,其它 成功例:调用其它程序system(“./play -f ./aaa.wav“);被调用者成为当前进程的子进程通过 system 可以调用任何程序和指令,system 首先 fork 子进程,然后调用 exec 执行 新的 shell,在 shell 中执行要执行的程序 2.exec 系列函数int execv(const char * path,char *const argv[]);int execve(const char * path,char *const argv[],char *const envp[]);int execvp(const char *file,char *const argv[]);int execl(const char *path,const char *arg,...);int execle(const char *path,const char *arg,...);int execlp(const char *file,const char *arg,...);path:要执行的程序路径,这里是路径名,可以是绝对路径或相对路径file:要执行的程序名,可以带路径argv:命令行参数数组envp:环境变量组。arg: 程序第 0 个参数即程序名本身,相当于 argv[0]exec 系统函数并不创建新进程,exec 系列函数是清除父进程的可执行代码映像,用新 程序的代码复盖调用 exec 的进程代码。 如果 exec 执行成功,进程将从新程序的 main 函数入口开始执行。 例:execl(“bin/ls“,“ls“,“-l“,NULL);char *para[]={“ls“,“-a“,NULL};execv(“/bin/ls“,para); 关 键 词: linux 高级 编程 进程
天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。