★进程标识符
算法
每一个进程都有非负的×××表示惟一的进程ID。下面是一些标识符:
pid:调用进程的ID(获取方式getpid)
ppid:调用进程的父进程ID(获取方式getppid)
uid:调用进程的实际用户ID(获取方式getuid)
euid:调用进程的有效用户ID(获取方式getuid)
gid:调用进程的实际组ID(获取getgid)
egid:调用进程的有效组ID(获取getegid)ide
例:用fork建立子进程,查看父子进程的pid、ppid、uid、euid。函数
运行结果:ui
★进程建立spa
上篇博客中提到可使用fork( )和execve( )来建立,咱们可以知道fork后的子进程可以得到父进程的数据空间、堆、栈的副本,父子进程同时共享文本段。因此说:子进程不能改变父进程中某个变量的值,内核只能修改内存副本中该变量的值。3d
例:blog
运行结果:进程
由上面的程序结果可以看到,子进程对变量的值进行更改,可是并无影响到父进程中变量的值。通常父进程和子进程执行的前后顺序是不肯定的,取决于系统的调度算法。上面的程序父进程先sleep,使得子进程先执行。内存
这里再介绍一下vfork( )函数,vfork和fork都可以建立一个子进程,可是vfork的子进程不会将父进程的地址空间进行复制,因此子进程会先执行,在其调用exec后或者exit后,父进程才能够执行。get
例:
运行结果:
★进程等待
进程等待可使用两个函数wait和waitpid。调用以后会产生如下的一些状况:
(1)若是全部的子进程都处于运行状态,则会阻塞。
(2)若是一个子进程已经终止,正在等待父进程获取其状态,则取得该子进程的终止状态当即返回。
(3)若是它没有任何的子进程,则当即出错返回。
头文件:#include <sys/types.h> #include <sys/wait.h>
① pid_t wait (int* status);
②pid_t waitpid(pid_t pid, int* status, int options);
wait函数若是成功,则返回被等待进程的pid,失败返回-1,waitpid函数正常返回收集到的子进程的ID,失败返回-1.