标签:用法 结构 lse 操作 write 子进程 clu family pes
forkfork()
调用一次返回两次:父进程返回子进程pid,子进程返回0。
进程是树形结构,子进程可随时通过getppid()获取父进程;
而父进程只能在创建时获取子进程号。
子进程使用父进程堆栈及数据空间副本等存储空间。代码正文段及文件共享,例如文件偏移量。
存储空间多采用写时复制的方式Copy-On-Write。一开始共享存储空间,直到子进程试图修改某个区域时,进行复制。复制单位一般为页大小。
常见用法:
1、父进程希望子进程复制自己,后处理不同的代码段。如网络请求,父进程等待请求,后续操作交给子进程;
2、父进程需要执行另一个不同的程序。一般交给子进程,fork()后exec()。如shell操作。
例子:
#include <unistd.h> #include <stdio.h> #include <sys/types.h> int main() { int money = 100; pid_t kid = fork(); if(kid < 0) { printf("wrong!"); }else if (kid == 0) { printf("I'm kid! pid=[%d]\n", getpid()); money += 10; }else { printf("I'm parent! pid=[%d] \n", getpid()); money -= 10; } printf("pid=[%d], ppid=[%d], money=[%d] \n", getpid(), getppid(), money); getchar(); return 0; }
运行结果:
I'm parent! pid=[3282] pid=[3282], ppid=[3139], money=[90] I'm kid! pid=[3283] pid=[3283], ppid=[3282], money=[110]
标签:用法 结构 lse 操作 write 子进程 clu family pes
原文地址:http://blog.51cto.com/10055124/2149211