赞
踩
/** **************************************************************************************** * @file 09_fork1.c * @author GuiStar-李什么恩 * @version V1.1.0 * @date 2023-4-15 * @brief 对fork函数的理解: * 1.一次调用fork会产生两次返回值: * 解释:因为fork调用会创建一个新的进程,这个新的进程就是子进程,也就是说,在fork调用之后, * 会存在两个进程,一个子进程,一个父进程。所以会有两个返回值,子进程会返回一个,父进程也会 * 返回一次。并且这两次返回值是不一样的,分别会返回一个0和大于0的整数,这个0是子进程的返回值, * 大于0的整数是父进程的返回值,所以我们可以通过不同的返回值来判断当前是父进程还是子进程,这 * 个大于0的整数其实就是子进程的pid * 2.fork创建了一个与原来进程几乎相同的进程: * 其实子进程是父进程的一个副本,fork函数是以复制的方式创建子进程,子进程几乎完全复制了父进 * 程,然后也从main函数的第一句开始执行,不同的是,fork()返回0,且不会创建新的子进程(否 * 则就递归创建无限个进程了),譬如子进程会考被父进程的数据段,堆,栈,并且拷贝父进程打开的所 * 有文件描述符,父进程与 * 子进程并不共享这些存储空间,这是子进程对父进程相应部分存储空间的完全复制,执行fork之 * 后,子进程和父进程各自在自己的进程空间中运行,每个进程均可以独立修改自己的堆栈空间中的变量 * 而不会影响另一个进程 * * @note 另外,在介绍两个函数getpid和getppid,他们都是无参函数,会分别返回当前进程的pid和当前进程 * 父进程的pid **************************************************************************************** */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(void) { int ret; int a=100; printf("I love IU!,my PID=%d\n",getpid()); ret=fork(); if(ret==-1) { perror("fork error"); exit(1); } else if(ret==0) { printf("I an a child,PID=%d,PPID=%d\n",getpid(),getppid()); printf("a=%d\n",a); a=10000; printf("a=%d\n",a); } else if(ret>0) { sleep(1); printf("I am a father,PID=%d\n",getpid()); printf("a=%d\n",a); } printf("I love IU!,my PID=%d\n",getpid()); return 0; }
参考文献:《正点原子LinuxC应用编程》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。