合伙做网站,电商怎么做营销推广w,机关建设网站,南昌网络营销外包公司全力以赴个人主页#xff1a;Lei宝啊
愿所有美好如期而遇 通过系统调用创建进程--fork函数 结果是什么呢#xff1f; 为什么会出来三个打印呢?
就是因为父进程调用了fork函数创建出了子进程的task_struct,但是一个进程不止task_struct#xff0c;还有代码和数据#xff0c;他们…
个人主页Lei宝啊
愿所有美好如期而遇 通过系统调用创建进程--fork函数 结果是什么呢 为什么会出来三个打印呢?
就是因为父进程调用了fork函数创建出了子进程的task_struct,但是一个进程不止task_struct还有代码和数据他们从哪里来于是子进程就从fork函数之后共享父进程的代码和数据。 再来看一段代码 感兴趣的话可以去试试通过fork返回的id值的不同去实现两个循环同时跑一个父进程的一个子进程的。
我们有三个问题
为什么fork给父进程的id返回子进程的PID给子进程的id返回0fork为什么会返回两个值 fork创建了子进程下面的代码都是共享的但是怎么一个id会有两个值呢 1一个父亲可以有多个儿子但一个儿子是不是只有一个父亲?(只考虑亲生的)也就是说当你走在外面碰见你父亲的朋友他就知道你父亲是谁但是你父亲和别人说我儿子是程序员有人就会问是哪个儿子?所以给父进程的id返回子进程的PID,要我们知道是创建了哪个子进程而给子进程返回0表示创建成功如果给父进程的id返回小于0的数那就是创建失败。
2在fork函数中我们说父进程会创建子进程的task_struct此时代码和数据也完成了共享CPU也就将他们同时跑起来了那么此时的fork函数的return也是代码吧是不是也共享那是不是父进程和子进程各自返回一次?
3父进程和子进程的代码和数据在子进程创建好后就共享了但是子进程对数据进行更改是不是也会影响到父进程呢
我们平时的经验告诉我们多个进程同时跑一个崩了其他的不会被影响就像我同时开着浏览器和QQ音乐其中一个崩了会不会影响另一个?不会这是操作系统设计好的进程之间是独立的谁也不会影响到谁。
那么子进程对数据修改是不是也不应该影响到父进程啊所以就有写时拷贝当父进程或者子进程对数据进行修改时会开辟一个临时变量拷贝原数据你对这个临时变量做修改。 那么id值会不会有两个呢我们想想C语言中变量名在编译后还存在吗
不存在了变量名是给程序员看的机器不需要所以编译后变量名就变成了地址我们的id也是如此他是虚拟地址映射到物理空间上的所以编译后由于父子进程其实不是一个地址是两个也就不存在一个id两个值的问题了。
在Linux中可以用一个变量名表示不同的地址。
我们试着创建多个进程: 看右边子进程不断被创建。 而后不断退出从S变成Z以及defunct