您的位置:首页 > 其它

fork()与vfork()

2014-03-07 16:09 92 查看
  进程在系统的唯一标识是PID,PID是一个从1到32768的正整数,其中1一般是特殊进程init,其它进程从2开始依次编号.当用完32768后,从2重新开始.

函数原型:(from百度)

pid_t fork( void);
(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

getpid();函数可以获取子进程id;getppid();可以获取父进程id。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。因此,子进程有了独立的地址空间,有两个和父进程相同的两个地址空间。而vfork和父进程共享一个空间(当有和父进程不同的内容是才另外开辟空间),实际上只有一个内存空间,是两个进程共享使用的。
如果使用vfork(),fork()的时候,父进程的缓冲区被更新了,则子进程就无法获取里面的内容,也就无法执行。(tip:因为缓冲区里面的内容有可能是变化的,有可能被更新了,相当于fflush());

 vfork 保证子进程先运行,在她调用 exec 或 exit 之后父进程才可能被调度运行。如果在 调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。






                                


第21行和22行后面没有  \n  (回车);因为fork();是复制了父程序,包括物理空间,他都是新开辟的。上面的对比,因为要输出的内容(printf)是存在于缓冲区的,linux是行缓冲的,加\n相当于把缓冲区更新输出了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: