0

0

Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit

蓮花仙者

蓮花仙者

发布时间:2025-07-21 08:26:18

|

1013人浏览过

|

来源于php中文网

原创

深入了解进程创建与终止:fork与exit函数的探索

我们之前已经讨论过fork函数,具体内容可以参考以下文章:

Linux系统 —— 进程系列 - 进程的概念,PCB与PID和fork_linux top adbd是什么线程-CSDN博客

https://www.php.cn/link/ed3fc73e6c5e6b0723e9e7935f50947a

今天我们将进一步探讨fork函数在Linux中的应用。

在Linux操作系统中,fork函数是一个关键的函数,它用于从现有进程中创建一个新的子进程。原始进程称为父进程,而新创建的进程称为子进程。

fork函数会返回两个不同的值:在子进程中返回0,而在父进程中返回子进程的PID。

代码语言:C

#include 
pid_t fork(void);
// 返回值:在子进程中返回0,在父进程中返回子进程的PID,出错时返回-1

Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit

以下是一个使用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;
}

运行结果:

[kiana@localhost ~]$ ./a.out
Before: pid is 43676
After: pid is 43676, fork return 43677
After: pid is 43677, fork return 0

Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exitLinux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit


进程的终止可以分为正常终止和异常终止。我们之前的示例中,1和2表示正常终止,而3表示异常终止。终止进程可以通过返回某个数字或调用exit函数来实现,这个数字称为退出码。我们可以通过echo $?来查看最近一个进程的退出码。

Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exitLinux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exitLinux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit

炉米Lumi
炉米Lumi

字节跳动推出的AI模型分享社区和模型训练平台

下载

  1. exit函数

Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit

运行结果:

Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit

我们发现,运行结果只执行到第一个printf,并没有执行第二个,因为代码在遇到exit函数时就直接终止了进程。那么,上述程序的退出码是什么呢?答案是40,因为exit函数无论在代码中的哪个位置,只要被调用就会立即终止调用它的进程。

Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exitLinux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit

_exit函数

#include 
void _exit(int status);
// 参数:status定义了进程的终止状态,父进程可以通过wait函数获取该值

虽然status是int类型,但父进程只能使用其低8位。因此,_exit(-1)时,终端执行$?会返回255。

// _exit
int main() {
    printf("hello");
    _exit(0);
}

运行结果:

[root@localhost linux]# ./a.out
[root@localhost linux]#

exit函数

#include 
void exit(int status);

exit函数最终也会调用_exit,但在调用_exit之前会执行以下操作:

  1. 执行用户通过atexit或on_exit定义的清理函数。
  2. 关闭所有打开的流,并将所有缓存数据写入。
  3. 调用_exit。
// exit
int main() {
    printf("hello");
    exit(0);
}

运行结果:

[root@localhost linux]# ./a.out
hello
[root@localhost linux]#

未完待续~

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

73

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

281

2023.11.28

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1988

2024.08.16

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号