饲料网站源码,宿迁房产网查备案,做网站给女朋友,个人做网站接装修活哪个网站好关于进程创建的一些细节都在注释中
/*#include sys/types.h#include unistd.hpid_t fork(void);函数的作用#xff1a;用于创建子进程。返回值#xff1a;fork()的返回值会返回两次。一次是在父进程中#xff0c;一次是在子进程中。在父进程中返回创建的子…关于进程创建的一些细节都在注释中
/*#include sys/types.h#include unistd.hpid_t fork(void);函数的作用用于创建子进程。返回值fork()的返回值会返回两次。一次是在父进程中一次是在子进程中。在父进程中返回创建的子进程的ID,在子进程中返回0如何区分父进程和子进程通过fork的返回值。在父进程中返回-1表示创建子进程失败并且设置errno失败的两个主要原因当前系统的进程数已经达到了系统规定的上限这时 errno 的值被设置为 EAGAIN系统内存不足这时 errno 的值被设置为 ENOMEM父子进程之间的关系区别1.fork()函数的返回值不同父进程中: 0 返回的子进程的ID子进程中: 02.pcb中的一些数据当前的进程的id pid当前的进程的父进程的id ppid信号集共同点某些状态下子进程刚被创建出来还没有执行任何的写数据的操作- 用户区的数据- 文件描述符表父子进程对变量是不是共享的- 刚开始的时候是一样的共享的。如果修改了数据不共享了。- 读时共享子进程被创建两个进程没有做任何的写的操作写时拷贝。*/
#include sys/types.h
#include unistd.h
#include stdio.hint main() {int num 10;// 创建子进程pid_t pid fork();// pid底层就是int类型// fork()以后子进程的用户区数据和父进程一样。内核区也会拷贝过来但是父子进程的pid不一样// 判断是父进程还是子进程if(pid 0) {// printf(pid : %d\n, pid);// 如果大于0返回的是创建的子进程的进程号当前是父进程printf(i am parent process, pid : %d, ppid : %d\n, getpid(), getppid());printf(parent num : %d\n, num);num 10;printf(parent num 10 : %d\n, num);} else if(pid 0) {// 当前是子进程printf(i am child process, pid : %d, ppid : %d\n, getpid(), getppid());printf(child num : %d\n, num);num 100;printf(child num 100 : %d\n, num);}// for循环for(int i 0; i 3; i) {printf(i : %d , pid : %d\n, i , getpid());sleep(1);}return 0;
}/*实际上更准确来说Linux 的 fork() 使用是通过写时拷贝 (copy- on-write) 实现。写时拷贝是一种可以推迟甚至避免拷贝数据的技术。内核此时并不复制整个进程的地址空间而是让父子进程共享同一个地址空间。只用在需要写入的时候才会复制地址空间从而使各个进行拥有各自的地址空间。也就是说资源的复制是在需要写入的时候才会进行在此之前只有以只读方式共享。注意fork之后父子进程共享文件(将父进程的整个地址空间复制给子进程包括文件描述符。)fork产生的子进程与父进程相同的文件文件描述符指向相同的文件表引用计数增加共享文件偏移指针。
*//* 文件描述符的细节在单个进程中文件描述符的值是唯一的不会重复。每个文件描述符都对应于进程的文件描述符表中的唯一条目。但在多进程情况下由于 fork 调用会复制父进程的文件描述符表给子进程导致子进程获得了与父进程相同的文件描述符值。这样不同的进程可以有相同的文件描述符值但它们对应的是各自独立的文件描述符表中的不同条目。
*/