首页 > 运维 > linux运维 > 正文

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

蓮花仙者
发布: 2025-07-21 08:26:18
原创
1005人浏览过

深入了解进程创建与终止: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 <unistd.h>
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;
}
登录后复制

运行结果:

<code>[kiana@localhost ~]$ ./a.out
Before: pid is 43676
After: pid is 43676, fork return 43677
After: pid is 43677, fork return 0</code>
登录后复制

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


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

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

Alkaid.art
Alkaid.art

专门为Phtoshop打造的AIGC绘画插件

Alkaid.art 153
查看详情 Alkaid.art

  1. exit函数

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

运行结果:

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

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

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

_exit函数

#include <unistd.h>
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 <unistd.h>
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]#
登录后复制

未完待续~

以上就是Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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