Linux系统编程(6)——进程控制--进程创建、进程终止

本文详细解析了进程创建中的fork函数及其返回值规则,介绍了进程的写时拷贝机制,对比了进程与线程的创建开销,并阐述了进程终止的多种方式,包括正常结束、异常终止及exit和_exit函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程创建: 

fork函数:创建子进程

  • 头文件:#include <unistd.h>
  • pid_t fork(void)
  • 返回值:子进程中返回0,父进程返回子进程pid,出错返回-1。

运行规则:

  1. 以父进程为模板,进行子进程的创建。
  2. 会把父进程的PCB拷贝一份,稍加修改,成为子进程的PCB。
  3. 会把父进程的虚拟地址空间拷贝一份,作为子进程的地址空间。
  4.  fork返回会在父子进程中分别返回。(返回值:子进程中返回0,父进程返回子进程pid,出错返回-1。)在fork后面进行继续执行。
  5. 父子进程的执行顺序没有先后关系,全靠调度器来实现。

注:拷贝是写时拷贝(C++中知识):父子进程共用一份代码,各有独自的数据。父子进程是互相独立的。由于大部分内存空间可能被拷贝,创建进程的开销仍然非常高。(是和线程相比,同样,有的情况下,线程创建也非常高(和协程相比),因此开销的大小比较是要有比较标准的。)

fork调用失败的原因:1、内存不够    2、进程太多

getpid():获取进程的id;getppid():获取父进程的id

#include<stdio.h>
#include<unistd.h>

int main(){
  pid_t ret =fork();
  if(ret > 0){
    //father
    int count=5;
    while(count>0){
    printf("father %d\n",getpid());
    sleep(1);
  }
  }else if(ret == 0){
//child
    while(1){
      printf("child %d,%d\n",getpid(),getppid());
      sleep(1);
      }
  }else{
    perror("fork");
  }
  return 0;
}

进程终止:

进程终止方式:

  1. 代码运行完毕,结果正确
  2. 代码运行完毕,结果不正确
  3. 代码没执行完,代码异常终止 

代码执行完情况:

  • main函数返回,返回值叫做进程的退出码,通过退出码表示运行结果是否运行结果正确。

注:退出码为0,表示结果正确。退出码为非零,表示结果不正确。

echo $?:查看上一个进程的退出码是多少。注:如果写return -1,查看到的结果是255

$?:是bash中的一个特殊的变量,这个变量表示上一个命令对应的退出码。


  • 调用exit函数(库函数,本质上也是调用了_exit)

头文件:#include<stdlib.h>

exit(<参数>):退出码是<参数>,exit在任何函数中都可以使用,使进程终止。

注:实际工作尽量少用,发生意外退出时,如果 exit() 写的很多,很难查到问题。

exit 比 _exit 多的地方:1、exit关闭流并且刷新缓冲区(main函数也可以刷新缓冲区)    2、多调用了结束函数


  • 调用_exit函数(系统调用)

头文件:#include<unistd.h>

实际还是 exit() 用的多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值