【Linux操作系统】 -- 进程的控制--进程的等待

目录

fork函数初识

 fork函数返回值

fork常规用法

fork调用失败的原因

进程终止

进程退出场景

进程退出的方式

 进程退出的用处

进程等待

进程等待必要性

进程等待的方法

wait方法

waitpid方法(重点)

status的理解

 waitpid获取退出码和信号的正确表达

 waitpid的理解

 【options的理解】:


fork函数初识

在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程

#include (通过man fork可查看)
pid_t fork(void);
返回值:自进程中返回0,父进程返回子进程id,出错返回-1

进程调用fork,当控制转移到内核中的fork代码后,内核做:

  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回,开始调度器调度

【Linux操作系统】 -- 进程的控制--进程的等待_第1张图片

 当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序

int main( void )
{
    pid_t pid;
    printf("Before: pid is %d\n", getpid());
    if ( (pid=fork()) == -1 )perror("fork()"),exit(1);
    printf("After:pid is %d, fork return %d\n", getpid(), pid);
    sleep(1);
    return 0;
}

运行结果:
[root@localhost linux]# ./a.out
Before: pid is 43676
After:pid is 43676, fork return 43677
After:pid is 43677, fork return 0

这里看到了三行输出,一行before,两行after。进程43676先打印before消息,然后它有打印after。另一个after消息有43677打印的。注意到进程43677没有打印before,为什么呢?如下图所示

所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。

【Linux操作系统】 -- 进程的控制--进程的等待_第2张图片

 fork函数返回值

  • 子进程返回0,
  • 父进程返回的是子进程的pid

写时拷贝

通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。

你可能感兴趣的:(Linux,linux)