💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力! 🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对Linux OS感兴趣的朋友,让我们一起进步!
进程创建是操作系统中启动一个新进程的过程。通常,进程创建由现有进程发起,称为父进程。创建新进程时,操作系统会分配资源(如内存、文件句柄等),并初始化进程控制块(PCB)。父进程通过调用系统调用(如UNIX中的fork()或Windows中的CreateProcess())来创建子进程。子进程通常会继承父进程的一些资源和属性,但也可以根据需要进行修改。进程创建后,子进程会与父进程并行执行,可能有自己的执行路径,也可能通过exec()等系统调用加载新程序。
fork()函数用于创建一个新的子进程,子进程是父进程的副本,拥有独立的进程ID。返回值区分父进程(返回子进程ID)和子进程(返回0)。
进程调用fork后,当控制转移到内核中的fork代码后,内核做:
fork之前⽗进程独⽴执⾏,fork之后,⽗⼦两个执⾏流分别执⾏。注意,fork之后,谁先执⾏完全由调度器决定。
通常,⽗⼦代码共享,⽗⼦再不写⼊时,数据也是共享的,当任意⼀⽅试图写⼊,便以写时拷⻉的⽅式各⾃⼀份副本(让权限出错,不一致)。具体⻅下图:
地址空间限制:在某些系统中,fork()会复制父进程的内存空间(例如,使用写时复制机制),如果内存地址空间过大或不允许复制,fork()可能会失败。
进程终止是指一个进程的执行结束,操作系统回收该进程所占用的资源并从进程表中移除。进程终止通常有两种方式:正常终止和异常终止。正常终止发生在进程完成其预定任务后,通常通过调用exit()系统调用或返回main()函数完成。异常终止则发生在进程出现错误时,如访问非法内存、除零错误等,通常由操作系统或运行时环境通过发送信号来处理,如SIGSEGV信号(段错误)。进程在终止时,会将退出状态码返回给父进程,父进程可以通过wait()或waitpid()等系统调用获取子进程的退出状态,并处理相关的清理工作。进程的终止不仅意味着其自身的消失,还会触发资源的释放,包括文件句柄、内存、CPU时间等,保证操作系统的资源得到有效管理。进程终止后,系统会在进程表中留下一个“僵尸”状态,等待父进程回收。
正常终⽌(可以通过 echo $? 查看进程退出码):打印最近一次程序的退出状态。
异常退出:退出码无意义
退出码(Exit Code),也称为返回值或退出状态码,是一个整数值,用于表示进程的执行结果。操作系统通过退出码来判断进程是否成功执行以及执行过程中的错误类型。
常见的退出码定义如下:
1:一般性错误,表示发生了某些问题,但未明确具体类型。 2:命令行使用错误或错误的参数传递。 127:命令未找到,通常在尝试执行一个不存在的命令时返回。 128:无效的命令退出,通常是由信号引起的异常退出。 130:通常由Ctrl+C(SIGINT信号)终止的进程。 137:表示进程由于接收到SIGKILL信号被强制终止。
void exit(int status); void _exit(int status);
在调用exit()时,标准库会执行以下操作:
_exit():_exit()是一个系统调用,它不会执行标准库的清理工作。
总结:
示例代码:
int main()
{
printf("hello");
exit(0);
}
运⾏结果:
[root@localhost linux]# ./a.out
hello[root@localhost linux]#
int main()
{
printf("hello");
_exit(0);
}
运⾏结果:
[root@localhost linux]# ./a.out
[root@localhost linux]#
进程等待是指一个进程在执行过程中暂停,等待另一个进程完成某些任务或条件。通常,父进程会等待子进程的终止,以回收子进程的资源。进程等待是进程间同步的一部分,确保进程的协调和资源的有效管理。在操作系统中,父进程通过调用wait()或waitpid()等系统调用,阻塞自己,直到子进程终止,并获取子进程的退出状态。进程等待有助于防止“僵尸进程”的产生,因为父进程会获取子进程的退出信息并回收资源。如果父进程不调用wait(),子进程会处于“僵尸”状态,操作系统仍会为其保留资源,直到父进程处理它。进程等待也常用于处理同步问题,例如多个进程需要按顺序完成任务。
进程等待的主要原因是确保进程间的协调和资源管理。当一个进程创建子进程后,父进程需要等待子进程完成任务,以回收子进程的资源,避免产生僵尸进程。如果父进程不等待,子进程的退出信息无法被回收,导致系统资源浪费。此外,进程等待用于进程间同步,确保任务按照特定顺序执行,避免数据竞争或不一致。例如,一个进程可能需要等待另一个进程的结果或某些条件满足才能继续执行。进程等待还能避免多进程环境中因过度并发而导致的资源冲突,提高系统稳定性和效率。
#include<sys/types.h> #include<sys/wait.h> pid_t wait(int* status); 返回值: 成功返回被等待进程pid,失败返回-1。 参数: 输出型参数,获取⼦进程退出状态,不关⼼则可以设置成为NULL
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有