再谈‘进程’

★进程标识符
   算法

        每一个进程都有非负的×××表示惟一的进程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。函数

wKiom1eWskSyDJZpAAC-KLZHQyU880.png


运行结果:ui

wKioL1eWsoKBdaqHAAAehicexjE096.png



★进程建立spa

      上篇博客中提到可使用fork( )和execve( )来建立,咱们可以知道fork后的子进程可以得到父进程的数据空间、堆、栈的副本,父子进程同时共享文本段。因此说:子进程不能改变父进程中某个变量的值,内核只能修改内存副本中该变量的值。3d


例:blog

wKioL1eWwIHB7kAfAACR9HwHWXI735.png


运行结果:进程

wKioL1eWwOrBVK8UAAAn9l7UbCo516.png


      由上面的程序结果可以看到,子进程对变量的值进行更改,可是并无影响到父进程中变量的值。通常父进程和子进程执行的前后顺序是不肯定的,取决于系统的调度算法。上面的程序父进程先sleep,使得子进程先执行。内存


     这里再介绍一下vfork( )函数,vfork和fork都可以建立一个子进程,可是vfork的子进程不会将父进程的地址空间进行复制,因此子进程会先执行,在其调用exec后或者exit后,父进程才能够执行。get


例:

wKiom1eWyLnRll-_AACqfNIUjVw365.png


运行结果:

wKiom1eWyTORdIL4AAAgTI5gaBM129.png



★进程等待

     进程等待可使用两个函数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.

相关文章
相关标签/搜索