本章学习内容
1.输出缓冲区问题(也叫printf函数输出问题)
2.主函数参数
3.进程的复制fork及相关概念(父进程 子进程 孤儿进程 僵死进程、写时拷贝)
一、输出缓冲区问题
我们要先了解,一个程序执行时输出数据是先存放到缓冲区,最后一起显示到屏幕上
数据打印到屏幕三种情况
(1)缓冲区满
(2)强制刷新缓冲区(“\n”和fflush)
(3)程序运行完毕
main1函数
执行完上述函数结果如下,由于是图片缘故,不能显示输出过程,所以这儿我口述,输出过程:在程序运行后 ,我们等待了三秒,屏幕上才显示出“Hello,World”我们需要的结果,所以说明该程序是运行完毕后将结果打印到屏幕上
main2函数
执行完上述函数结果如下, 在程序运行后 ,屏幕上直接显示出“Hello,World”我们需要的结果,但后边的条框还在闪,等待三秒控制面板下一行才自动弹出,证明此时程序才执行完毕,说明该程序是通过强制刷新缓冲区(“\n”或“fflush”)先将数据传送到屏幕上,再继续执行
所以综上我们可以得出结论 “\n”与fflush强刷缓冲区
二、 主函数参数(主函数参数包括参数个数、参数内容、环境变量)
首先我们要了解,在我们执行C代码时,主函数main()中也是包含参数的,只不过我们平时使用不到所有()内的值从未填写过
main函数如下
代码结果如下
“hello”和“123”是传递给主函数的参数 ,下方为部分环境变量
总结:参数个数从main开始为第一个参数 ,主函数参数包括参数个数、参数内容、环境变量
三、复制进程fork及相关内容
1.fork的用法
main函数代码如下:
结果如下:
这样我们可以清晰的看出因为fork复制了进程,父进程输出的为“partant”,子进程输出为“child”
2.父进程和子进程、父子进程的返回值、孤儿进程、僵死进程、写时拷贝
(1)父进程和子进程
fork复制新的进程后,新产生的进程称作子进程,原先的进程叫做父进程
(2)父子进程的返回值(getpid)
fork后父子进程一模一样但返回值不同 子进程返回值为0 父进程返回值是子进程id号
main函数,只需将fork用法的呼出结果修改,添加pid号获取
结果如下:
(3)孤儿进程
父进先程结束,子进程会变成孤儿进程,系统会重新分配父进程
(4)僵死进程(defunct)
子进程先结束,父进程未获取退出码(调用wait获取退出码),子进程就会变成僵死进程
上图中defunct所标识的就为僵死进程 (在后台运行main.c程序,页面输入ps会显示上图)
(5)写时拷贝
fork()复制内存页面时,如果父子进程页面中内容没发生改变,他两共享一份页面,如果要子进程的页面中内容时,需要将原先父进程的内容拷贝一份给子进程,让其修改