基本使用
- #include
- #include
- #include
-
- int main(){
- printf("main\n");
- pid_t myId = getpid();
- printf("myId:%d\n", myId);
- pid_t pid = fork();
- if(pid == 0){
- printf("i'am child process\n");
- }else if(pid > 0){
- printf("i'am parent process, new child process:%d\n", pid);
- }else{
- printf("fork failed");
- }
- printf("%d, exit\n", getpid());
- return 0;
- }
输出
- main
- myId:8628
- i'am parent process, new child process:8629
- 8628, exit
- i'am child process
- 8629, exit
注意,fork()调用之后的代码两个进程都会执行,通过判断fork()返回值是否为0确认是否是子进程。
变量的拷贝
- #include
- #include
- #include
-
- int main(){
- pid_t myId = getpid();
- printf("[%d] main\n", myId);
- int i = 0;
- while(i < 2){
- printf("[%d] [@%ld]i=%d\n", getpid(), &i, i);
- pid_t pid = fork();
- if(pid == 0){
- printf("[%d] i'am child process:%d\n",getpid(), getpid());
- }else if(pid > 0){
- printf("[%d] i'am parent process:%d, new child process:%d\n", getpid(), getpid(), pid);
- }else{
- printf("[%d] fork failed", getpid());
- }
- i++;
- printf("[%d] set i = %d\n", getpid(), i);
- }
- printf("[%d] end\n", getpid());
- sleep(60);
- return 0;
- }
运行结果
- yeqiang@yeqiang-PC:~/tmp$ ./a.out
- [11145] main
- [11145] [@140732325423988]i=0
- [11145] i'am parent process:11145, new child process:11146
- [11145] set i = 1
- [11145] [@140732325423988]i=1
- [11146] i'am child process:11146
- [11146] set i = 1
- [11145] i'am parent process:11145, new child process:11147
- [11146] [@140732325423988]i=1
- [11145] set i = 2
- [11145] end
- [11147] i'am child process:11147
- [11147] set i = 2
- [11147] end
- [11146] i'am parent process:11146, new child process:11148
- [11146] set i = 2
- [11146] end
- [11148] i'am child process:11148
- [11148] set i = 2
- [11148] end
- yeqiang@yeqiang-PC:~/tmp$ pstree -p 11145
- a.out(11145)─┬─a.out(11146)───a.out(11148)
- └─a.out(11147)
说明,每一次fork,都会拷贝变量到新的进程,其进程看到的虚拟地址是一样的。