刷新缓冲区:
1.程序结束前
2.碰见换行符\n
3.碰见fflush() fflush(stdout);
4.缓冲区满了
return:关键字 结束当前功能
exit:函数调用 结束进程前刷新缓冲区再调用_exit exit(0)正常退出,非零异常退出
_exit:内核级别函数 只结束程序不会刷新缓冲区
fork() 进程复制(除了进程PID所有内容状态全复制)
返回值为pid_t —>int的重命名 父进程返回值大于0,子进程返回值小于0 -1复制失败
头文件为 #include<unistd.h> #include<sys/types.h>
fork复制后,子进程从fork后的语句开始执行
示例1:
int main()
{
printf("a\n");
fork();
}
打印一个a 父进程遇见\n直接刷新缓冲区打印a,fork复制一份后子进程从fork以下的语句继续执行,fork后没有语句程序结束
示例2:
int main()
{
fork();
printf("a\n");
return 0;
}
打印两个a fork复制一份,父进程向下执行打印一个a,子进程执行fork以下的语句打印一个a
示例3:
int main()
{
printf("a");
fork();
}
打印两个a 父进程缓冲区一个a,fork后复制父进程缓冲区里的一个a,程序结束
示例4:
int main()
{
for(int i=0;i<2;i++)
{
fork();
printf("a\n");
}
}
打印六个a
示例5:
int main()
{
for(int i=0;i<2;i++)
{
fork();
printf("a");
}
}
打印8个a
示例6:
fork()||fork();
printf("a\n");
3个a
僵尸进程:
子进程先于父进程结束,父进程没有获取到子进程的退出码,子进程即为僵尸进程
解决僵尸进程:
头文件 #include<sys/wait.h>
wait(NULL); 阻塞函数 一般不会用到退出码,参数传空
孤儿进程:
父进程先于子进程结束,子进程的父进程由init进程接管