天天看点

fork() and vfork() getppid's result

fork和vfork的描述和区别参考本文最后的部分.

下面来看看用fork或vfork创建的子进程, 子进程看到的ppid(父进程是多少).

fork : 

接下来看看环境变量会不会也变掉 . 

从结果来看, 环境变量会继承下去, 不会因为init接管而改变.

    原因是这些进程是主进程fork出来的, 还记得前几天写的一篇《fork and page sharing》, 本例中主进程的内存空间不会因为主进程退出而马上释放掉, 因为子进程还需要用到共享的内存部分.  环境变量也存储在主进程的某些内存空间里面, 具体是哪块空间目前还不清楚 . 

    vfork()创建的子进程, 父进程号是多少呢? 我想不说也知道了, 就是创建子进程的进程的进程号. 因为vfork创建子进程, 父进程要等待子进程执行完成. 就好像默认用了waitpid.

另外要提一下, 为什么fork()的返回值类型是pid_t, 包括还有其他一些系统函数返回值并不是c语言的基本类型(int, char, short, long, float,或者double). 因为在不同的操作系统中, 用来存储进程号的数据类型可能不一样, 如有的系统可能用short, 也有的可能用int.

如果你写程序的时候使用short来存储fork()的返回值, 那么当这个程序要在另一个操作系统用int来表述进程号的环境下编译运行就可能出现问题.

使用pid_t很好的规避了这个问题.

【参考】

http://en.wikipedia.org/wiki/zombie_process

http://en.wikipedia.org/wiki/orphan_process

http://en.wikipedia.org/wiki/daemon_(computing)

vfork : 

getpid, getppid : 

继续阅读