在编写socket ftp之前,我对fork函数进行了学习。
先看这段范例代码:
#include <unistd.h>;
#include <sys/types.h>;
main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %dn",getpid());
else
printf("i am the parent process, my process id is %dn",getpid());
}
这段代码写了一个使用fork函数创建子进程,父子进程同时运行而产生交错的,不一样的运行结果。
运行结果如下:
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
fork在英文中是叉子,分叉的意思,在函数fork中,取后面的意思。很形象的表示程序从这里分叉,fork函数创建了子进程,子进程和父进程同时(其实是cpu分时处理)开始运行分叉之后的程序。
我把程序改写了一下:
#include <unistd.h>
#include <sys/types.h>
main()
{
pid_t pid;
printf("\n[%d]not fork pid=%d\n",getpid(),pid);
pid=fork();
printf("\n[%d]forked pid=%d\n",getpid(),pid);
if(pid<0)
{
printf("error in fork!\n");
getchar();
exit(1);
}
else if(pid==0)
printf("\n[%d]in child process,p_id=%d\n",getpid(),getpid());
else
{
printf("\n[%d]in parent process,my pid=%d\n",getpid(),pid);
printf("\n[%d]in parent process,my getpid=%d\n",getpid(),getpid());
}
}
程序运行结果如下:
[hardy@localhost fork]$ ./fork
[3819]not fork
[3820]forked pid=0
[3820]in child process,p_id=3820
[3819]forked pid=3820
[3819]in parent process,my pid=3820
[3819]in parent process,my getpid=3819
可以清楚的看到 not fork只打印了一次,其中[3819]是父进程的进程号,创建fork以后,fork函数返回给父进程的值pid是子进程的进程号[3820],而在子进程中,pid值为零。也就是说子进程中,pid被置零。
引用网上一位网友的解释“其实就相当于链表,进程形成了链表,父进程pid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其pid为0. ”
下面有一个很有意思的程序:
#include <sys/types.h>
#include <unistd.h>
int main()
{
int i;
for( i= 0; i< 3; i++)
{
int pid= fork();
if(pid== 0)
{
printf("son\n");
}
else
{
printf("father\n");
}
}
return 0;
}
大家想想看最后将出现几个son 几个father呢?
。
。
。
。
。
。
。
对一下答案吧:
[hardy@localhost fork]$ ./fork
father
son
son
son
father
father
son
father
son
son
father
father
son
father
总共7个son7个father。你答对了么?
这道题需要在纸上画画才好理解
for i=0 1 2
father father father
son
son father
son
son father father
son
son father
son
其中每一行分别代表一个进程的运行打印结果。
当产生子进程的时刻,子进程打印son,当子进程调用fork的生成子子进程,他就提升为father。
总结来说,father永远打印father,son在fork之前是son,fork之后就为father,同时生成新的son。
这个比喻就像真正的父子,孩子长大了生了小孩,孩子就成了父亲。而父亲永远是父亲。
分享到:
相关推荐
linux_fork函数
linux内核 do_fork 函数源代码浅析。 经典讲解!
一些简单的linux下进程管理文件示例,关于fork()函数的,可以作为入门级别的
用fork创建子进程; 回答no执行父进程,yes执行父进程并复制进程的操作;在父进程将str3,str4接至str0中,并输出str0 ;在子进程中,将str1,str2接至str0中,并输出str0
在win系统下模拟linux中的fork()函数执行过程与基础通信过程 备注清晰。
关于fork函数的介绍,和测试程序,原版fork linux平台
fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的...
本文档内容是我自己写的一个关于fork函数新建进程并对调用流程进行分析的文档。 运行环境是win7安装vmware虚拟机里的linux系统,直接gcc编译得到的执行结果。 看完次文档后即可对fork有一个比较系统的认识。
linux中fork()函数详解.docx
2.fork 函数被调用一次,但返回两次, 两次返回的唯一区别是子进程的返回值是 0, 而父进程的返回值是新子进程的 PID。 3.子进程和父进程继续执行 fork 调用之后的指令。 在上图的存储空间布局中,父子进程只共享正文...
Linux系统编程的进程操作,C语言,明晰子进程的创建结构
最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下
该事例程序属多进程调用小程序,采用了系统调用函数fork()进行子进程的调用。在该文档中介绍了fork()调用的相关细节及注意点以及父子进程段的关系。并将程序运行后输出到屏幕结果与输出重定向到文件后的结果进行比较...
中文函数列表 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程
linux下的fork函数机理说明和用法。非常详细和生动。
Linux 中 fork() 函数详解,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/45165811
使用fork、exit和exec系统调用编写多进程程序
linux当中可以使用fork函数创建一个新进程 #include pid_t fork(void); 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1 在fork调用之后,子进程获得父进程数据空间、堆和栈的副本,但是并不...
linux系统调用fork()的详细剖析,必然令你恍然大悟~~~
LINUX的消息函数的分析,很详细,有流程图的