前言这里是偶发呆的小年糕童鞋。虽然是课堂上的实验,但我想好好完成它,好好学习。这也是一个宝贵的机会来提高自己理解它(??????)??。本次实验主要是在Linux下进行的一些小的编程实验,以了解一些关于进程的知识。疑惑来了首先,我拿到了老师给我们的实验指导书。这个程序初看很简单:后来发现运行结果很奇怪。一般来说,我们认为它只有在分叉时才会执行。中的一个。当然关键在于对fork()函数的理解(毕竟我们之前没有接触过b( ̄▽ ̄)d)。fork()的调查看一些bigtouch的博客说,调用fork()函数后:系统首先为新进程分配资源,比如存储数据和代码的空间。然后将原进程中的所有值复制到新的新进程中,只有少数值与原进程不同。这就像克隆自己。结合fork()的返回值判断:在父进程中,fork返回新创建的子进程的进程ID;在子进程中,fork返回0;如果发生错误,fork返回一个负值;还是有点朦胧感觉有点朦胧,后来写了个傻程序来测试:几乎每一步都插入一句输出。while()函数是为了延长运行时间来区分是不是并行程序。然后我们看结果:我们会发现子程序确实像父进程的拷贝,输出和父进程一样(除了用来区分的标识,3657是新创建的进程IDcreatedchildprocessbytheparentprocess,子进程运行时出现0。),确实子程序和父程序是并行的(看两个开始)。但是查询资料后会发现,子进程复制父进程时,会从父进程运行的地方继续运行,也就是同时复制父进程的记录指针。所以如果在这个程序的开头加上一句输出,在子进程中是不会显示的。另外,我们有一个问题?为什么会有[root@localhostcpp]这样的东西??后来百度才知道,shell会监听它运行的进程(也就是父进程)的结束。当输出last3657时,父进程也会结束。这时候系统会自动输出[root@localhostcpp]!子流程呢?因为shell并不关心父进程自己新创建的进程,当父进程结束时,子进程自动归类为系统进程,所以父进程结束后,子进程可以继续运行。那我们再试一次,在这个程序的最后加一个wait(0);运行结果如下:wait(0)的作用是等待所有的子进程运行完毕,所以此时,并没有像之前那样出现这种情况。其他のExpansion这时候我们再来看一些其他的实验:这个跟我们一开始做的很像。程序会创建一个子程序,子程序和父程序是并行的,但是一般因为速度很快,所以两者交叉的可能性不大。这样我们就可以大致了解结果了。这个程序多了一句exit(0),可以退出子程序,所以我们可以猜测子进程输出xb,父进程输出xay。结语高小年的写法未必完全正确QAQ。如有错误和偏差,欢迎指正( ̄▽ ̄)。如果你也有同样的疑惑,不知道你是否明白我说的。嘻嘻,总之谢谢你的手表。
