`
sealbird
  • 浏览: 584880 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

linux fork函数学习

阅读更多
在编写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中的`fork()`函数详解 #### 一、`fork()`函数基础介绍 在Linux操作系统中,`fork()`函数是一个非常重要的系统调用,用于创建一个新的进程。这个新进程被称为子进程,而调用`fork()`函数的原进程则称为父...

    linux内核 do_fork 函数源代码浅析

    ### Linux 内核 do_fork 函数源代码浅析 #### 一、引言 在 Linux 内核中,进程的创建是一项基本且重要的功能。本文将深入剖析 do_fork 函数,它作为核心组件之一,在 Linux 内核中扮演着创建新进程的关键角色。do_...

    linux fork函数

    在Linux操作系统中,`fork()`函数是创建新进程的关键接口,它是C标准库中的一个系统调用。这个函数允许一个正在运行的进程(父进程)创建一个与它几乎完全相同的副本,即子进程。理解并熟练使用`fork()`是进行进程...

    linux下fork函数实例

    用fork创建子进程; 回答no执行父进程,yes执行父进程并复制进程的操作;在父进程将str3,str4接至str0中,并输出str0 ;在子进程中,将str1,str2接至str0中,并输出str0

    fork函数和子函数进程

    ### fork函数和子进程知识点详解 #### 一、引言 在计算机编程中,特别是针对多任务处理领域,进程管理是实现系统并发的关键技术之一。其中,`fork()`函数是Unix/Linux系统中创建新进程的核心手段。通过深入理解`...

    演示fork函数的效果

    在"演示fork函数的效果"这个主题中,我们将深入探讨`fork()`的工作原理以及如何使用它。 首先,`fork()`函数的调用会返回两次:一次在父进程中,一次在子进程中。在父进程中,`fork()`返回新创建子进程的进程ID...

    在win系统下模拟linux中的fork()函数执行过程与基础通信过程

    在win系统下模拟linux中的fork()函数执行过程与基础通信过程 备注清晰。

    linuxC函数手册.chm

    5. **进程与线程**:Linux提供了一套丰富的系统调用来管理进程和线程,如fork()创建新进程,exec()系列函数执行新的程序,pthread_create()创建线程,pthread_join()等待线程结束等。 6. **信号处理**:通过...

    Linux C 函数详解

    在书中,作者首先介绍了C语言的基础知识,包括变量、数据类型、运算符、控制结构等,为后续的函数学习打下坚实基础。接着,详细讨论了C语言的函数库,如中的输入/输出函数,如printf和scanf;中的字符串处理函数,如...

    fork函数使用

    关于fork函数的介绍,和测试程序,原版fork linux平台

    linux c语言函数速查手册

    在Linux下,可以使用`pthread`库创建和管理线程,`fork`创建子进程,`wait`和`waitpid`等待子进程结束。 八、网络编程 `socket`函数创建套接字,`bind`绑定IP地址和端口,`listen`等待连接,`accept`接收连接,`...

    linux下socket和fork结合使用的例子

    在Linux操作系统中,`socket`、`fork`和`c/c++`是构建网络应用程序的常见工具。`socket`用于创建通信端点,允许不同进程间进行数据交换,`fork`则是Unix/Linux系统中用于创建新进程的关键系统调用。本示例中,我们将...

    linux系统函数(chm)

    为了更深入地学习Linux系统函数,你可以参考"Linux系统函数.chm"文档,它应该包含了详尽的函数说明和示例代码。同时,利用在线资源,如man手册页(通过命令`man function_name`)和Linux编程书籍,能进一步巩固和...

    linux中fork()函数详解.docx

    Linux 中 fork() 函数详解 fork() 函数是 Linux 操作系统中最基本也是最重要的系统调用之一,它允许一个进程创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的...

    linux c fork全面剖析

    ### Linux C 中 fork() 函数全面剖析 #### 进程概念及上下文 要深入了解 `fork()` 函数的工作原理,首先要理解操作系统中的“进程”这一基本概念。在计算机科学中,“进程”通常指的是一个可执行程序的一次执行...

    linux 进程 线程 fork 的深入思考

    本篇文章将基于一道经典的面试题目来探讨 Linux 下进程创建机制,特别是 `fork` 函数的工作原理。该题目不仅考验应试者对进程创建的理解,还涉及了对进程间关系的认识。 #### 题目描述 假设有一段 C 语言程序,在 ...

    Linux开发函数手册

    4. **进程操作篇**:讨论了如何在Linux中创建、管理、通信和调度进程,如fork()、exec()、wait()和signal()函数,这些都是实现并发编程的基础。 5. **文件权限控制篇**:讲解如何使用chmod、chown、chgrp等命令,...

    Linux C 函数.CHM

    Linux C 函数库是开发基于Linux系统应用的重要资源,它包含了大量的C语言函数,这些函数在操作系统层面提供了与硬件交互、文件操作、进程...这份资源对于学习和开发Linux应用的程序员来说,无疑是一份宝贵的参考资料。

    Linux系统函数最全收集(学习linux必备)

    Linux系统函数是编程人员在开发针对Linux操作系统的应用程序时不可或缺的一部分。...这个压缩包中的.chm文件很可能是一个帮助文档,其中详细解释了各个函数的使用方法和示例,对于学习和查阅Linux API非常有帮助。

Global site tag (gtag.js) - Google Analytics