深入了解进程创建与终止: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

以下是一个使用fork函数的示例代码:
int main(void) { pid_t pid; printf("Before: pid is %dn", getpid()); if ((pid = fork()) == -1) { perror("fork()"), exit(1); } printf("After: pid is %d, fork return %dn", getpid(), pid); sleep(1); return 0;}
运行结果:
[kiana@localhost ~]$ ./a.outBefore: pid is 43676After: pid is 43676, fork return 43677After: pid is 43677, fork return 0


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



豆包AI编程
豆包推出的AI编程助手
483 查看详情
exit函数

运行结果:

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


_exit函数
#include void _exit(int status);// 参数:status定义了进程的终止状态,父进程可以通过wait函数获取该值
虽然status是int类型,但父进程只能使用其低8位。因此,_exit(-1)时,终端执行$?会返回255。
// _exitint main() { printf("hello"); _exit(0);}
运行结果:
[root@localhost linux]# ./a.out[root@localhost linux]#
exit函数
#include void exit(int status);
exit函数最终也会调用_exit,但在调用_exit之前会执行以下操作:
执行用户通过atexit或on_exit定义的清理函数。关闭所有打开的流,并将所有缓存数据写入。调用_exit。
// exitint main() { printf("hello"); exit(0);}
运行结果:
[root@localhost linux]# ./a.outhello[root@localhost linux]#
未完待续~
以上就是Linux系统 —— 进程控制系列 – 进程的创建与终止 :fork与exit的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/456425.html
微信扫一扫
支付宝扫一扫