标签:
Linux进程入门
学习Linux下通信过程中看两本书《Linux网络编程》和《Unix环境下高级编程》。在此也不想评论哪本书好,哪本书不好,想详细了解的话还是建议看《Unix环境高级编程》。本文是在看《Linux网络编程》一书的学习记录。
思维导图如下:
创建进程
通过fork()创建进程,fork()系统调用调用一次返回两次,返回给父进程的是子进程的进程id(pid)。返回给子进程的是0。通过父进程没有相应的函数获取子进程id。但是子进程可以通过getppid()获取父进程id,getpid()获取本身进程id。
Fork()调用细节
Fork()将父进程数据和代码完全拷贝给子进程。他们运行在不同的地址空间。所以子进程修改某个局部变量与父进程不会跟着修改。值得一提的是子进程从父进程中继承而来的文件描述符。他们都相当于指针的作用。实际数据在系统空间中。类似
Pa1和pa2指向同一个地址,修改*pa1,*pa2随着修改。文件描述符原理类似。
上面没有检查函数的返回值。这不是个好习惯。
以上程序运行的结果如下:
首先子进程移动文件指针,位置为10。父进程再移动指针,如果父进程当前文件指针位置为0,则read之后,pos应该为10。根据输出结果可以知道文件父进程的文件指针在read之前已经到达10了,所以说父子进程都应用同一个文件描述符。
进程同步
通过wait和waitpid来同步。Wait会堵塞,直到有子进程退出,父进程从内核中取出退出进程的退出信息。Waitpid有选项设置是否堵塞。
进程终止
Exit与_exit函数都可以退出进程。Exit会关闭文件描述符,刷新缓冲区。_exit没有这些处理。
两种异常退出
1.父进程运行结束,子进程还没运行结束。则由init进程对子进程进行领养
2.子进程结束,但是在父进程中没有调用wait来获取子进程的退出状态。成为僵死进程。
标签:
原文地址:http://www.cnblogs.com/ickelin/p/4196724.html