进程创建
pstree
讯享网

讯享网
大多数操作系统,对进程的识别采用唯一的进程标识符—pid(process identifier),这是一个整数值。系统内的每一个进程,都有唯一的pid,用以标识索引,以便访问内核中进程的属性。
通过ps命令我们可以查看进程的详细属性:

当一个进程创建子进程时,该子进程需要一定的资源(cpu、内存、IO)来完成任务,子进程可以从操作系统获得资源,也可以从父进程获得资源子集。在UNIX中,用系统调用fork(),创建子进程。子进程复制了父进程地址空间,父子进程执行相同的代码,不同的是父进程返回值是子进程的pid(非零),而子进程fork后的返回值为0。这是我们区分父子进程的方式,在之后的代码中就可以通过判断pid值的不同,从而让父子进程执行不同的代码
通过man fork我们可以看到更加详细的函数说明


但是在fork之前的代码只有父进程执行。
当fork()之后,进程间执行方式:
1:父子进程并发执行(这是会出现两种结果,父进程先执行完,子进程变成孤儿进程,被init收养或init的子进程收养,子进程变成后台进程;二是子进程先结束,父进程未回收子进程,就会称为僵尸进程)
(1)我们创建父子进程,让父进程10秒后结束,子进程休眠,代码如下:


刚开始,父子进程并发执行:before fork执行一次,可见fork仅复制fork之后的资源等。

可以看到,刚开始父进程17639的父进程是17502,子进程17640的父进程是17639,之后父进程结束,子进程的父进程是1382。

通过ps -elf | grep 1382可以查到1382的父进程是1号进程init,这是在Ubuntu图形管理界面下的情况,在命令行界面下,子进程会被1号init收养。
最后,别忘了kill掉子进程

(2)我们创建父子进程,让子进程10秒后结束,父进程休眠,代码如下:



可以看到子进程被放到小棺材里面了,等待火化中。
子进程练习:

讯享网#include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { pid_t pid; for(int i = 0;i < 5;i++){ pid = fork(); if (pid < 0){ perror("fork"); return 0; }else if(pid == 0){ printf("child process\n"); sleep(5); }else { printf("father process\n"); sleep(5); break; } } sleep(100); return 0; }

#include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { pid_t pid; for(int i = 0;i < 5;i++){ pid = fork(); if (pid < 0){ perror("fork"); return 0; }else if(pid > 0){ printf("father process\n"); sleep(5); }else { printf("child process\n"); sleep(5); break; } } sleep(100); return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/128461.html