Fork(复制进程),僵死进程,printf,-Linux

mac2026-02-09  9

Fork函数定义

fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。


printf方法: 缓冲区放满后程序结束后强制刷新缓冲区   "\n"   fflush(stdout) 为什么父子进程地址相同?

       答:在程序中看到的地址是虚拟(逻辑)地址,不是真实的物理地址。

  先使用malloc后,再使用fork,子进程也有一份父进程在堆区申请的空间

 


Fork函数示例1

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <unistd.h> int main() { char* s = NULL; int n= 0; pid_t pid = fork(); assert( pid != -1 ); if( pid == 0)//zi { s = "child"; n = 7; } else { s = "parent"; n = 3; } int i = 0; for( ; i<n ;i++) { printf("s=%s,pid=%d,ppid=%d,&s=%x\n",s,getpid(),getppid(),&s); sleep(1); } exit(0); }

运行结果

可见,子进程与父进程同时进行。

子进程的pid为父进程的pid加一。父进程未结束时,子进程的ppid为父进程的pid。父进程先于子进程结束时,因不允许存在孤儿进程,故子进程的父进程就变为pid为1的进程。


Fork函数示例2

​#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <unistd.h> int main() { char* s = NULL; int n= 0; pid_t pid = fork(); assert( pid != -1 ); if( pid == 0)//zi { s = "child"; n = 3; } else { s = "parent"; n = 7; } int i = 0; for( ; i<n ;i++) { printf("s=%s,pid=%d,ppid=%d,&s=%x\n",s,getpid(),getppid(),&s); sleep(1); } exit(0); }​

与示例1 不同于子进程与父进程执行的次数


运行结果

子进程产生<defunct>

僵死进程:

子进程先于父进程结束,并且父进程没有调用wait获取子进程的退出码,此时子进程变成僵死进程

wait取消僵死:

{ int val = 0; pid_t child_pid = wait(&val); if(WIFEXITED(val)) { printf("child_pid = %d, val = %d\n",child_pid,WEXITSTATUS(val)); } }

 

最新回复(0)