您的位置:首页 > 其它

关于fork() 使用的一点总结

2012-01-31 11:56 471 查看
====本文系本站原创,欢迎转载! 转载请注明出处:http://blog.csdn.net/yyplc====

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: