电影网站源码系统,海外广告联盟平台推广,梅州市城乡建设部网站首页,网课如何推广在C语言中#xff0c;一般使用fork函数开辟进程#xff0c;这个函数开辟进程后会返回一个进程号#xff0c;在子进程中会返回0#xff0c;在父进程中会返回子进程的进程号。
int main(){int ret fork();if(ret0){fprintf(stderr, pid error);exit(-1);}e… 在C语言中一般使用fork函数开辟进程这个函数开辟进程后会返回一个进程号在子进程中会返回0在父进程中会返回子进程的进程号。
int main(){int ret fork();if(ret0){fprintf(stderr, pid error);exit(-1);}else if(ret 0){printf(this is son\n);}else if(ret0){printf(this is father, sons pid is %d\n, ret);}return 0;
}
this is father, sons pid is 2700
this is son 因为父进程为原始进程而子线程需要新开辟所以一般情况下父进程总是先进行下一步。 当 fork() 被调用时父进程和子进程共享相同的物理内存页直到其中一个进程尝试修改这些页。当修改发生时操作系统会为该页创建一个新的物理内存副本并更新相应的页表以确保每个进程都有自己的私有内存空间。这种技术大大减少了 fork() 的开销因为大多数时候子进程会立即执行 exec() 替换其内存映像而无需修改父进程的内存。 有开始就有退出程序除了自然退出还可以使用exit和_exit函数退出。_exit直接使进程终止清除其使用的内存空间并清除其在内核中的各种数据结构。exit是在_exit上进行的封装在此之上还增加了清理IO缓存等功能。 在进程结束后往往需要回收进程如果不回收进程可能会导致一系列问题。在操作系统中每个进程都会占用一定的系统资源包括内存、CPU时间片等。当进程结束时如果不进行回收这些资源可能不会被正确释放导致资源泄漏。资源泄漏会逐渐耗尽系统资源影响系统的稳定性和性能。 在Linux操作系统中当进程结束时操作系统会自动回收其占用的资源确保系统资源的有效利用和管理的有效性。当一个进程正常或异常终止时它会关闭所有打开的文件描述符并释放其在用户空间分配的内存。这是进程在退出时自动完成的操作。然而此时进程的进程控制块PCB仍然存在于内核中其中保存了进程的状态信息如退出状态、终止信号等。为了彻底清除进程并释放其占用的所有资源需要其父进程进行回收操作。通过调用这些函数父进程可以获取子进程的PCB信息并进行清理工作包括释放PCB占用的内存等。 PCB是操作系统为管理进程而设置的一个专门的数据结构用于记录进程的外部特征并描述其运动变化过程。它是系统感知进程存在的唯一标志进程与PCB是一一对应的。PCB的大小取决于操作系统的实现和支持的功能不同的操作系统和不同的进程可能有不同的PCB大小。PCB中主要包括以下信息pid进程标识符进程状态程序计数器PC用于记录下一条要执行的指令地址寄存器值保存进程在执行过程中的寄存器值内存管理信息记录进程的内存分配情况包括代码段、数据段、堆栈等文件描述符表优先级父进程标识符PPID子进程列表信号处理器。此外PCB还可能包含进程的控制信息如进程当前状态、程序的外存地址、运行统计信息、进程间同步和通信等。以及资源管理信息如占用内存的大小、输入/输出设备的设备号、缓冲区地址等。 如果父进程没有回收子进程子进程将成为僵尸进程。僵尸进程是一个已经终止但尚未被父进程回收的进程它仍然占用进程表中的一个条目。为了避免僵尸进程的产生通常建议在父进程中正确处理子进程的退出并及时回收它们。当然如果父进程在子进程之前退出子进程将成为孤儿进程。孤儿进程会被init进程PID为1的进程接管并由init进程负责回收其资源。这是Linux系统的一种保护机制确保即使父进程异常退出子进程也能得到正确的处理。 在Linux系统中我们可以使用ps来方便的查看进程的相关信息ps -aux 在C程序中一般使用wait和waitpid等回收进程前者是阻塞等待任意子进程结束后者可以设定等待对应子进程已经等待方式。