linux 父子进程联系

         由于linux是一个多用户的操作系统,在同一时间可能会有多个用户争夺系统资源,进程为了及时,及早的完成任务(得到系统资源)就创建了子进程来争夺系统资源。一旦子进程用fork()创建成功,父子进程就会一起从fork处继续执行【例1】,两个进程相互争夺系统资源。

      我们希望子进程继续执行,这个时候就得让父进程挂起,直到子进程完成任务,那么在这种情况下我们就得用函数wait或者waitpid来帮助了。

 

       例1:

       #include <stdio.h>
       #include <unistd.h>
       int main ()
      {
              pid_t pid;
              printf("Before create child process;\n");
              pid=fork();
              printf("After create child process.\n");

              return 0;
      }

      输出结果:

Before create child process.

After create child process.

After create child process.

          我们都知道,unix系统限制了某一时刻能同时存在进程的最大数目,如果不及时清理系统中的僵死进程【一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程:zombie。调用fork两次以避免僵死进程】,那么再次产生新的进程时,可能产生错误。由于这些原因一般在子进程中调用exit之后在父进程中调用wait或者waitpid函数。父进程调用这两个函数之后会获取子进程的结束信息,进行相关的清理动作。

       引用:《unix环境高级编程》,调用这两个函数之后产生下面的情况:

      A:阻塞(如果它的子进程还在运行)

      B:立即返回子进程结束信息(如果一个子进程已经结束并等待父进程获取信息)
      C:如果没有任何子进程,则立即出现错误返回。

      这两个函数的区别:

      1:在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。

      2:另外waitpid并不是等待第一个结束的进程而是等待参数中pid指定的进程。

waitpid的option常量
A:WNOHANG      waitpid将不阻塞如果指定的pid并未结束
B:WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。

 

waitpid提供了wait没有提供的三个功能:

1:waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态【如果一个子进程已经终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态,否则wait使其调用者阻塞直到一个子进程终止。如果调用者阻塞而且它有多个子进程,则在其一个子进程终止时,wait就立即返回。因为wait返回终止子进程的进程ID,所以它总能了解到哪一个子进程终止了】

2:waitpid提供了一个wait的非阻塞版本。

3:waitpid支持作业控制。



         

 

Linux中,父子进程常见的问题包括: 1. 父子进程间的通信:父子进程可以通过管道、共享内存、消息队列等方式进行通信,以实现数据的交换和同步操作。 2. 子进程的状态获取:父进程可以使用wait/waitpid函数来获取子进程的状态,包括子进程的退出状态和资源使用情况。 3. 父子进程间的同步:在某些情况下,父进程需要等待子进程完成某些任务后再继续执行。可以使用wait/waitpid函数或者使用信号机制来实现父子进程的同步。 4. 父子进程共享内存的问题:在vfork调用中,子进程父进程共享内存,这可能导致父子进程之间的访存冲突。程序需要注意避免在共享内存区域进行写操作,以免影响到其他进程的运行。 5. 父子进程的资源管理:父子进程共享一些资源,如文件描述符、系统信号处理函数等。在创建子进程时,父进程需要考虑好资源的合理分配和管理,以免造成资源的浪费或冲突。 总之,父子进程之间的关系和交互是Linux中常见的问题,合理的设计和管理可以确保程序的正确运行和资源的有效利用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux父子进程的一些常见问题](https://blog.csdn.net/flurry_rain/article/details/122327665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [关于linux父子进程几个问题的总结](https://blog.csdn.net/qq_27569699/article/details/120568763)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值