printf缓冲区(打印会满足以下三个条件之一)
1.缓冲区放满会直接打在屏幕上
2.缓冲区未满,用户强制刷新
3.程序结束
fflush(stdout); 直接刷新输出缓冲区
主函数参数
int main(int argc,char* argv[],char* envp){}
// 参数个数 参数内容 环境变量当执行某个命令时,如./mian命令,./main本质上是一个可执行程序,bush复制自己本身,将复制出来的子bush替换成main程序,然后运行main程序。
父进程的父进程是bush
fork 复制一个进程,产生子进程
fork(); 如果返回值为0;说明创建子进程成功,-1表示创建失败
pid_t pid=fork();
if(pid==-1){//创建判断
exit(1);
}
if(pid==0){
//子进程
}
else{
//父进程
}注意: 子进程pid 父进程ppid
获取子进程 id getpid() 获取父进程 id getppid()
父子进程使用的不是一块内存空间
我们需要注意:在程序中看到的地址是逻辑地址而不是物理地址,所以,当地址相同的时候也不一定是一块内存。

求物理地址:&n%4k=商(页号),余数(页内偏移量)(4k具体看系统)
写时拷贝:是为了提高fork效率,将可以共享的尽量共享,不能共享的则只能拷贝

这里是子进程结束后才能获取到退出码。在子进程结束之前,wait进程都是阻塞状态
僵尸进程:僵尸状态的进程(子进程先结束,父进程没有获取子进程的退出码)
wait():获取子进程的退出码
pid_t wait(int *wstatus);(这里是4个字节的指针)
#include<sys/wait.h>
int val=0;
int child_pid=wait(&val);
if(WIFEXITED(val)){
printf("error exit: %d\n"WEXITSTATUS(val));
}
exit(3);//程序退出码孤儿进程(父进程先结束,那么就要为子进程重新找一个父进程,新的父进程来获取子进程的退出码。防止出现僵死进程)
fork()||fork();

此时会产生3个结果
for(int i=0;i<2;i++){
fork();
printf("A"):
}
版权声明:本文为qq_48757526原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
