再谈‘进程’

★进程标识符
   

        每个进程都有非负的整形表示唯一的进程ID。下面是一些标识符:
               pid:调用进程的ID(获取方式getpid)
                 ppid:调用进程的父进程ID(获取方式getppid)
                 uid:调用进程的实际用户ID(获取方式getuid)
                 euid:调用进程的有效用户ID(获取方式getuid)
                 gid:调用进程的实际组ID(获取getgid)
                 egid:调用进程的有效组ID(获取getegid)


例:用fork创建子进程,查看父子进程的pid、ppid、uid、euid。

wKiom1eWskSyDJZpAAC-KLZHQyU880.png


运行结果:

wKioL1eWsoKBdaqHAAAehicexjE096.png



★进程创建

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


例:

wKioL1eWwIHB7kAfAACR9HwHWXI735.png


运行结果:

wKioL1eWwOrBVK8UAAAn9l7UbCo516.png


      由上面的程序结果能够看到,子进程对变量的值进行更改,但是并没有影响到父进程中变量的值。一般父进程和子进程执行的先后顺序是不确定的,取决于系统的调度算法。上面的程序父进程先sleep,使得子进程先执行。


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


例:

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.




本文出自 “无心的执着” 博客,请务必保留此出处http://10740590.blog.51cto.com/10730590/1830353

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值