关于fork() 使用的一点总结
2012-01-31 11:56
471 查看
====本文系本站原创,欢迎转载! 转载请注明出处:http://blog.csdn.net/yyplc====
fork()为系统调用API,创建者使用它可以创建出一个新进程,创建者为父进程,新进程为子进程。创建者中调用fork(),返回值为0时是子进程,大于0,为父进程,小于0,则创建子进程失败。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈,代码段等资源的副本。子进程持有的只是上述存储空间的“副本”,这意味子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。这一点和线程thread就不一样。
当父进程提前退出(或者说死掉)的时候,如果子进程还存在,那么,这样的子进程编程了孤儿进程,并不因此结束自己的运行,会过继给pid 为1 的init进程,init进程就是它的父进程。
当父进程创建子进程的时候,这两个进程就是并行处理,下一步的谁先执行,顺序是随机的,这和内核任务调度有关系。
测试代码:
运行结果:
fork()为系统调用API,创建者使用它可以创建出一个新进程,创建者为父进程,新进程为子进程。创建者中调用fork(),返回值为0时是子进程,大于0,为父进程,小于0,则创建子进程失败。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈,代码段等资源的副本。子进程持有的只是上述存储空间的“副本”,这意味子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。这一点和线程thread就不一样。
当父进程提前退出(或者说死掉)的时候,如果子进程还存在,那么,这样的子进程编程了孤儿进程,并不因此结束自己的运行,会过继给pid 为1 的init进程,init进程就是它的父进程。
当父进程创建子进程的时候,这两个进程就是并行处理,下一步的谁先执行,顺序是随机的,这和内核任务调度有关系。
测试代码:
#include <unistd.h> #include <sys/param.h> #include <rpc/types.h> #include <getopt.h> #include <strings.h> #include <time.h> #include <signal.h> int main(void) { int ret; static int count; ret = fork(); if (ret < (pid_t)0 ) { printf("fork failed\n"); } else if (ret == (pid_t)0) //子进程 { while(1) { printf(" i am child process(my father: %d, myself: %d)\n",getppid(),getpid()); sleep(1); if (count++ > 10) break; } printf("i am dead,my pid: %d\n",getpid()); return 0; } else //父进程 { printf(" i am father process(my father: %d, my child: %d)\n",getppid(),getpid()); sleep(5); printf("i am dead,my pid: %d\n",getpid()); } return ret; }
运行结果:
root@wsn-laptop:/home/wsn/mylinux/code/fork# ./fork i am father process(my father: 1988, my child: 5821) i am child process(my father: 5821, myself: 5822) i am child process(my father: 5821, myself: 5822) i am child process(my father: 5821, myself: 5822) i am child process(my father: 5821, myself: 5822) i am child process(my father: 5821, myself: 5822) i am dead,my pid: 5821 root@wsn-laptop:/home/wsn/mylinux/code/fork# i am child process(my father: 1, myself: 5822) i am child process(my father: 1, myself: 5822) i am child process(my father: 1, myself: 5822) i am child process(my father: 1, myself: 5822) i am child process(my father: 1, myself: 5822) i am child process(my father: 1, myself: 5822) i am child process(my father: 1, myself: 5822) i am dead,my pid: 5822
相关文章推荐
- 关于 ST eMotion board 使用DFU的一点总结
- 关于使用控件的一点总结
- 一点关于使用FusionCharts的体会与总结
- 关于Linux STL使用的一点总结
- 关于在applet中使用JDBC访问数据库的一点总结
- 关于Java Primitive类型与内置Wrapper类型使用过程中的一点小总结
- 关于layoutSubviews的一点使用总结
- 关于使用git一点额外总结
- 关于使用OpenXml向Excel插入数据的一点总结
- 关于layoutSubviews的一点使用总结
- java和struts使用中的一点总结--关于写在页面上的select域的选项选中后保存状态的办法!
- 关于在SetWindowLong函数中使用cbWndExtra的一点总结
- 关于NSString使用的一点总结
- 分享关于php CI框架使用的一点小总结
- 关于Android开发中JNI/NDK使用的一点总结
- 关于JS里面创建对象的一点总结
- 关于RemoteCallbackList的使用的一点心得
- 关于移动端开发宽度高度,字体以及rem宽度使用的总结
- 关于SAVEPOINT和自定义异常使用的一点看法
- Wix 使用总结(续)--关于Feature和Component的状态判断安装过程