父子进程概述

父子进程概述

总结了两篇博客,对父子进程涉及的问题进行了简要总结(参考博客在文章末尾)

创建进程的目的一般有两个:

  • 一是父进程希望生成一份自己的副本,执行同一个程序中不同的代码片段。
  • 二是让子进程执行不同的程序。

在父进程中使用fork函数创建子进程,方式是直接pid_t id = fork();

其中父子进程对应的返回值不同:若返回值为0表示子进程创建成功(进入子进程的执行)、大于零说明是在父进程执行(这时返回值是子进程的PID),失败为-1

创建子进程时,父子进程数据共享,当任一方对共享数据做了改动,就会发生写时拷贝,即分配新的物理地址给要修改的一方,这保证了进程的独立性

当系统中进程数量过多或用户的进程数量过多可能导致进程创建失败


进程退出的方式有:exec_execmain函数中的return三者,其中exec_exec的一种封装,即_exec是系统调用,exec是库函数

此外,当ctrl+ckill时会使进程异常退出


进程等待是指父进程等待子进程退出,不然会出现kill不掉的僵尸子进程,方式有waitwaitpid两种,

waitpid的参数进行进行设置可有阻塞、非阻塞等待两种方式


要使得子进程能够执行不同的程序,可以使用exec系列函数


目的1示例(引自参考二):

#include<stdio.h>              
#include<unistd.h>
#include<stdlib.h>
/*
创建子进程,通过父进程和子进程返回值的不同,使得父进程和子进程执行不同的代码分支
*/

int main(){
  //创建子进程
  pid_t val=fork();
  //判断父子进程
  if(val<0){    
  	//返回值小于0,说明子进程创建失败
    printf("create error\n");
  }else if(val==0){          
  	//返回值等于0,说明进入这里的是子进程
    printf("this is son\n");
  }else{                    
  	//返回值大于0,说明进入这里的是父进程
    printf("this is father\n");
  }
  return 0;
}  

目的2示例(引自参考一):

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    int id = fork();

    if(id == 0) // 子进程
    {
        execl("/usr/bin/ls","ls","-l","-a","--color=auto",NULL);
        exit(1); // 因为execl会替换新的程序,所以如果子进程走到这里替换必定失败
    }

    wait(NULL); // 父进程回收子进程
    return 0;
}

参考一:【Linux】进程控制:父进程与子进程_linux父子进程-优快云博客

参考二:Linux 进程:父子进程-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值