在编写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()`函数详解 #### 一、`fork()`函数基础介绍 在Linux操作系统中,`fork()`函数是一个非常重要的系统调用,用于创建一个新的进程。这个新进程被称为子进程,而调用`fork()`函数的原进程则称为父...
### Linux 内核 do_fork 函数源代码浅析 #### 一、引言 在 Linux 内核中,进程的创建是一项基本且重要的功能。本文将深入剖析 do_fork 函数,它作为核心组件之一,在 Linux 内核中扮演着创建新进程的关键角色。do_...
在Linux操作系统中,`fork()`函数是创建新进程的关键接口,它是C标准库中的一个系统调用。这个函数允许一个正在运行的进程(父进程)创建一个与它几乎完全相同的副本,即子进程。理解并熟练使用`fork()`是进行进程...
用fork创建子进程; 回答no执行父进程,yes执行父进程并复制进程的操作;在父进程将str3,str4接至str0中,并输出str0 ;在子进程中,将str1,str2接至str0中,并输出str0
### fork函数和子进程知识点详解 #### 一、引言 在计算机编程中,特别是针对多任务处理领域,进程管理是实现系统并发的关键技术之一。其中,`fork()`函数是Unix/Linux系统中创建新进程的核心手段。通过深入理解`...
在"演示fork函数的效果"这个主题中,我们将深入探讨`fork()`的工作原理以及如何使用它。 首先,`fork()`函数的调用会返回两次:一次在父进程中,一次在子进程中。在父进程中,`fork()`返回新创建子进程的进程ID...
在win系统下模拟linux中的fork()函数执行过程与基础通信过程 备注清晰。
5. **进程与线程**:Linux提供了一套丰富的系统调用来管理进程和线程,如fork()创建新进程,exec()系列函数执行新的程序,pthread_create()创建线程,pthread_join()等待线程结束等。 6. **信号处理**:通过...
在书中,作者首先介绍了C语言的基础知识,包括变量、数据类型、运算符、控制结构等,为后续的函数学习打下坚实基础。接着,详细讨论了C语言的函数库,如中的输入/输出函数,如printf和scanf;中的字符串处理函数,如...
关于fork函数的介绍,和测试程序,原版fork linux平台
在Linux下,可以使用`pthread`库创建和管理线程,`fork`创建子进程,`wait`和`waitpid`等待子进程结束。 八、网络编程 `socket`函数创建套接字,`bind`绑定IP地址和端口,`listen`等待连接,`accept`接收连接,`...
在Linux操作系统中,`socket`、`fork`和`c/c++`是构建网络应用程序的常见工具。`socket`用于创建通信端点,允许不同进程间进行数据交换,`fork`则是Unix/Linux系统中用于创建新进程的关键系统调用。本示例中,我们将...
为了更深入地学习Linux系统函数,你可以参考"Linux系统函数.chm"文档,它应该包含了详尽的函数说明和示例代码。同时,利用在线资源,如man手册页(通过命令`man function_name`)和Linux编程书籍,能进一步巩固和...
Linux 中 fork() 函数详解 fork() 函数是 Linux 操作系统中最基本也是最重要的系统调用之一,它允许一个进程创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的...
### Linux C 中 fork() 函数全面剖析 #### 进程概念及上下文 要深入了解 `fork()` 函数的工作原理,首先要理解操作系统中的“进程”这一基本概念。在计算机科学中,“进程”通常指的是一个可执行程序的一次执行...
本篇文章将基于一道经典的面试题目来探讨 Linux 下进程创建机制,特别是 `fork` 函数的工作原理。该题目不仅考验应试者对进程创建的理解,还涉及了对进程间关系的认识。 #### 题目描述 假设有一段 C 语言程序,在 ...
4. **进程操作篇**:讨论了如何在Linux中创建、管理、通信和调度进程,如fork()、exec()、wait()和signal()函数,这些都是实现并发编程的基础。 5. **文件权限控制篇**:讲解如何使用chmod、chown、chgrp等命令,...
Linux C 函数库是开发基于Linux系统应用的重要资源,它包含了大量的C语言函数,这些函数在操作系统层面提供了与硬件交互、文件操作、进程...这份资源对于学习和开发Linux应用的程序员来说,无疑是一份宝贵的参考资料。
Linux系统函数是编程人员在开发针对Linux操作系统的应用程序时不可或缺的一部分。...这个压缩包中的.chm文件很可能是一个帮助文档,其中详细解释了各个函数的使用方法和示例,对于学习和查阅Linux API非常有帮助。