精华内容
下载资源
问答
  • 标 题: [问题]TCP编程,父进程执行socket,bind,listen,accept后,这  发信站: 水木社区 (Fri Jan 24 14:39:31 2014)  来 源: 114.249.213.144    【以下内容由 daoyu 转寄于 Programming 版】  ☆──...

    【转自水木bbs】 http://www.newsmth.net/nForum/#!article/Programming/79359

    标  题: [问题]TCP编程中,父进程执行socket,bind,listen,accept后,这 

    发信站: 水木社区 (Fri Jan 24 14:39:31 2014) 
    来  源: 114.249.213.144 
      
    【以下内容由  daoyu  转寄于  Programming  版】  
    ☆─────────────────────────────────────☆  
      
     AnneSun (AnneSun)  于  (Thu Jan 23 21:41:16 2014)  在 
      
    [问题]TCP编程中,父进程执行socket,bind,listen,accept后,这  的大作中提到:  
      
    TCP编程中,sever端执行socket,bind,listen,accept后,父进程进入等待接收外部链接状态。 
    现在server端调用fork创建子进程,在子进程中接收/处理外部数据。 
    server端创建的两个套接字分别命名为: 
    int sockfd = socket(); 
    int accptfd = accept(); 
    在fork执行子进程后,sockfd可以close了吗,还是要等到子进程执行完后才能close? 
      
    测试的结果是: 
    子进程创建完后, close(sockfd)或者不执行close(sockfd),对子进程接收客户端结果没有影响。 
      
    问题: 
    socket()生成的套接字是监听套接字,它不是应该在服务器的生命期内一直存在吗? 
    为何close了监听套接字,服务器还能起作用呢? 
       
      
      
      
      
      
      
    ☆─────────────────────────────────────☆  
      
     Orpherus (奥路菲)  于  (Thu Jan 23 21:47:53 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    apue看了吗? 关于fork之后父子进程的资源关系 
      
    【 在 AnneSun (AnneSun) 的大作中提到: 】 
    : TCP编程中,sever端执行socket,bind,listen,accept后,父进程进入等待接收外部链接状态。 
    : 现在server端调用fork创建子进程,在子进程中接收/处理外部数据。 
    : server端创建的两个套接字分别命名为: 
    : ................... 
      
      
      
    ☆─────────────────────────────────────☆  
      
     heracules (NULL)  于  (Thu Jan 23 22:28:44 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    UNP的第30章没看过? 
    【 在 AnneSun (AnneSun) 的大作中提到: 】 
    : TCP编程中,sever端执行socket,bind,listen,accept后,父进程进入等待接收外部链接状态。 
    : 现在server端调用fork创建子进程,在子进程中接收/处理外部数据。 
    : server端创建的两个套接字分别命名为: 
    : ................... 
      
      
      
    ☆─────────────────────────────────────☆  
      
     AnneSun (AnneSun)  于  (Thu Jan 23 23:38:44 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    恩,刚看了一下fork: 
    fork复制当前进程,创建新进程。子进程代码和父进程完全相同,他的数据和和父进程也完全相同。父进程中打开的文件描述符默认在子进程中也打开了,其用户根目录,当前工作目录等变量的引用计数会加1. 
    但子进程的信号位图,PPID改变了。 
      
    当父进程结束后,init进程接管了该子进程,并等待它结束。 
      
    因为这些,所以可以关闭监听套接字了。 
      
    谢谢啦! 
      
    【 在 Orpherus 的大作中提到: 】 
    : apue看了吗? 关于fork之后父子进程的资源关系 
    :    
      
      
      
    ☆─────────────────────────────────────☆  
      
     AnneSun (AnneSun)  于  (Thu Jan 23 23:47:39 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    恩,刚才大概看了一下UNP中TCP并发服务器(每个客户一个子进程)的那个例子: 
    貌似他是每fork一个子进程,就close一遍监听套接字啊?感觉不合理啊? 
    监听套接字不是只有一个吗?close了多次啊 
      
    可能需要测测这个例子。。。 
      
      
    【 在 heracules 的大作中提到: 】 
    : UNP的第30章没看过? 
      
      
      
    ☆─────────────────────────────────────☆  
      
     hgoldfish (老鱼)  于  (Thu Jan 23 23:58:04 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    这个问题在书上有解释。 
      
    【 在 AnneSun (AnneSun) 的大作中提到: 】 
    : 恩,刚才大概看了一下UNP中TCP并发服务器(每个客户一个子进程)的那个例子: 
    : 貌似他是每fork一个子进程,就close一遍监听套接字啊?感觉不合理啊? 
    : 监听套接字不是只有一个吗?close了多次啊 
    : ................... 
      
      
      
    ☆─────────────────────────────────────☆  
      
     heracules (NULL)  于  (Fri Jan 24 00:15:43 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    子进程又不调用accept,close掉侦听fd很自然啊 
    【 在 AnneSun (AnneSun) 的大作中提到: 】 
    : 恩,刚才大概看了一下UNP中TCP并发服务器(每个客户一个子进程)的那个例子: 
    : 貌似他是每fork一个子进程,就close一遍监听套接字啊?感觉不合理啊? 
    : 监听套接字不是只有一个吗?close了多次啊 
    : ................... 
      
      
      
    ☆─────────────────────────────────────☆  
      
     RichyMong (L-I-N-G)  于  (Fri Jan 24 10:16:07 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    这个也是引用计数的问题啊。你每fork一次会导致listenfd的引用计数加1 
    close使其引用计数减1,当变化0的时候才进程真正的连接关闭,资源释放等工作。 
      
    【 在 AnneSun 的大作中提到: 】 
    : 恩,刚才大概看了一下UNP中TCP并发服务器(每个客户一个子进程)的那个例子: 
    : 貌似他是每fork一个子进程,就close一遍监听套接字啊?感觉不合理啊? 
    : 监听套接字不是只有一个吗?close了多次啊 
    : ................... 
      
      
      
    ☆─────────────────────────────────────☆  
      
     AnneSun (AnneSun)  于  (Fri Jan 24 10:28:12 2014)  在 
      
    Re: [问题]TCP编程中,父进程执行socket,bind,listen,accept后  的大作中提到:  
      
    恩,有道理。 
      
    谢谢啦! 
      
    【 在 RichyMong 的大作中提到: 】 
    : 这个也是引用计数的问题啊。你每fork一次会导致listenfd的引用计数加1 
    : close使其引用计数减1,当变化0的时候才进程真正的连接关闭,资源释放等工作。 
    :    
    展开全文
  • 编写一个C语言程序,使用系统调用fork()创建子进程,利用getpid()和getppid()分别获得进程的PID和父进程PID,使用sleep()将先关进程挂起指定时间
  • fork创建子进程

    千次阅读 2016-11-08 13:38:31
    最初,父进程通过fork系统调用创建子进程,子进程被创建后,处于创建状态。Linux内核为子进程配置数据结构,如果内存空间足够,子进程内核就绪,否则swap分区就绪。这时子进程处于就绪状态,等待Linux内核调度...

    流程

    子进程被Linux内核调入CPU执行的过程

    进程的生命周期包括从创建到退出的全部状态转化,它的生成周期里并不一定要经历所有的状态。

    最初,父进程通过fork系统调用创建子进程,子进程被创建后,处于创建状态。Linux内核为子进程配置数据结构,如果内存空间足够,子进程在内核中就绪,否则在swap分区就绪。这时子进程处于就绪状态,等待Linux内核调度。

    Linux内核会为子进程分配CPU时钟周期,在合适的时间将子进程调度上CPU运行,这时子进程处于内核状态,子进程开始运行。被分配的CPU时钟周期结束时,Linux内核再次调度子进程,将子进程调出CPU,子进程进入用户状态。

    待子进程被分配的下一个CPU时钟周期到来时,Linux内核又将子进程调度到CPU运行,使子进程进入内核状态。如果有其他的进程获得更高优先级,子进程的时钟周期可能会被抢占,这时又会回到用户状态。

    子进程进入睡眠状态

    子进程在运行时,如果请求的资源得不到满足将进入睡眠状态,睡眠状态的子进程被从内存调换到swap分区。被请求的资源可能是一个文件,也可能是打印机等硬件设备。如果该资源被释放,子进程将被调入内存,继续以系统状态执行。

    子进程结束

    子进程可以通过exit系统调用结束,这时子进程将进入到僵死状态,生命周期结束。

    例子

    这里是一个通过fork()创建一个子进进程的例子,其中左边的红线表示父进程的流程,有表表示子进程的流程。

    代码

    #include <unistd.h> //fork()
    #include <sys/types.h>
    #include <stdio.h>  //puts()
    
    int main()
    {
        int status;
        puts("start");
    
        //创建子进程
        pid_t pid = fork();
        if(pid==-1){
            perror("创建子进程失败");
            return 1;
        }
    
        //判断是否是子进程  
        if(pid==0){
            puts("I'm child");
    
            puts("sleep 5s ...");
            sleep(5);
            puts("sleep end");
    
            printf("子进程PID是%d\n", getpid());
            printf("父进程PID是%d\n", getppid());
    
            return 0;
        }
        else{
            puts("I'm parent");
    
            printf("子进程PID是%d\n", pid);
            printf("父进程PID是%d\n", getpid());
        }
    
        wait(&status);
        printf("%d\n", status);
        puts("main end");
        return 0;
    }

    运行结果

    start
    I'm parent
    子进程PID是22875
    父进程PID是22874
    I'm child
    sleep 5s ...
    sleep end
    子进程PID是22875
    父进程PID是22874
    0
    main end

    参考

    • Linux环境C程序设计
    展开全文
  • 子进程是父进程的一个完全拷贝,如何理解?为什么fork创建子进程后,父进程中运行过的代码在子进程中不再运行了?

    老羊快跑微信公众号,内有老羊的《200分钟PCB设计傻瓜教程》,免费观看

    一个进程,包括代码、数据和分配给进程的资源,当然还有进程运行的状态。Linux下fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,一般课堂上讲的是“子进程是父进程的一个完整拷贝”,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

          一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值(包括状态)都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

    那么问题来了:从下面的程序和运行结果我们知道父进程的进程号是4254,子进程的进程号是4255,命令行终端的进程号是4232,那么为什么在执行程序的时候,子程序没有执行第一行语句“printf("$+%d\n",getpid());”  ?子进程不是父进程的完整拷贝么?


    答案:的确子进程包含有和父进程一样的代码和数据(虽然一样但的确是自己的一份)。但别忘了,自己成复制的不仅是父进程的代码和数据,还包括状态,这个状态就包含有PC指针寄存器的值。也就是说子进程创建完成后,他和父进程一样,PC指针都指向下一条语句, 因此子进程是从自身创建完成后的地方继续运行,而父进程运行过得代码将不再运行。这就是为什么fork之前已经运行过的printf函数没有在子进程中运行的原因。
    展开全文
  • linux:通过fork()创建子进程 系统调用fork()后,俩个进程将执行相同的程序段,但是拥有各自不同的堆段,栈段,数据段,每个子程序都可修改各自的数据段,堆段,和栈段 1.通过调用fork()后,产生了两个不同的...

    linux:通过fork()创建子进程

    系统调用fork()后,俩个进程将执行相同的程序段,但是拥有各自不同的堆段,栈段,数据段,每个子程序都可修改各自的数据段,堆段,和栈段

    1.通过调用fork()后,产生了两个不同的pid值

    #include <stdio.h>
    #include <unistd.h>
    
    int count1=0;
    int main(void)
    {
        int pid;
        int count2=0;
        count1++;
        count2++;
        printf("count1=%d,count2=%d\n",count1,count2);
    
        pid=fork();
        count1++;
        count2++;
        printf("count1=%d,count2=%d\n",count1,count2);
        printf("pid=%d\n",pid);
    
        return 0;
    }
    
    

    在这里插入图片描述
    2.调用fork()后,错误返回-1,子进程返回0,父进程返回子进程的pid值

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    int main()
    {
    int ret = fork();
    if(ret < 0){
    perror("fork");
    return 1;
    }
    else if(ret == 0){ //child
    printf("I am child : %d!, ret: %d\n", getpid(), ret);
    }else{ //father
    printf("I am father : %d!, ret: %d\n", getpid(), ret);
    }
    sleep(1);
    return 0;
    }
    

    在这里插入图片描述

    展开全文
  • pcntl_fork()函数是php用于创建子进程的一个函数,返回创建的子进程的pid。 该函数创建子进程具体fork的过程: (1)调用该函数即创建一个子进程,创建成功父进程返回子进程的pid,子进程返回0; (2)创建子...
  • 当可执行文件开始运行之后,就变为了系统的一个进程,一个程序(可执行文件)运行起来之后可以创建多个进程执行,称之为多进程程序。 每个进程包含有进程运行环境、内存地址空间、进程ID、和至少一个被称为线程的...
  • C语言中的fork()讲解 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程...然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值...
  • Linux进程全解4——fork创建子进程

    千次阅读 2017-07-13 09:41:28
    1、为什么要创建子进程? (1)每一次程序的运行都需要一个进程; (2)多进程实现宏观上的并行。 2、fork的内部原理 (1)进程的分裂生长模式 如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个...
  • fork创建进程 fork系统调用是用于创建进程的,并且fork创建的...fork返回两次,(父进程中)第一次返回子进程id,(在子进程中)第二次返回0 .换句话说就是返回子进程id的是父进程,返回0的是子进程。 测试代码 ...
  • fork创建进程初始化状态与父进程一样(对于进程进程空间,包括内存以及内核态等,初始化时一模一样,包括他们拥有的变量、逻辑空间等) 系统为fork进程分配新的资源(包括CPU、内存资源等) fork系统调用没有...
  • linux创建进程函数fork()正确调用一次的时候有两个返回值: 子进程返回:0 父进程返回:>0的整数(返回子进程ID号) 而错误的时候返回-1 而介绍fork()函数时的应用例子一般都为以下结构:如下例: #...
  • 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 系统有一个父进程和两个子进程活动。 让每一个进程屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...
  • fork函数最重要的是:fork()函数被调用一次,却会被返回两次,返回两次的区别,子进程返回的是0,而父进程返回的是子进程的ID。若调用错误则返回-1。 1.Fork.c 1.Fork.c #include "csapp.h" /* $begin fork */...
  • fork调用后,子进程与父进程是否共享变量

    万次阅读 多人点赞 2018-01-07 16:13:25
    fork系统调用从已存在的进程中生成一个新的进程,这个新的进程就是子进程,我们可以通过fork系统调用的返回值来区分子进程还是父进程。 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用...
  • fork创建子进程利用pipe管道通信

    万次阅读 2016-09-19 14:00:57
    每个进程各自有不同的用户地址空间,任 何一个进程的全局变量另一个进程中都看不到,所以进程之间要交换数据必须通过内核,内核开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把...
  • c) 在子进程中向管道内写入 128k 数据,打印出进程号及成功写入的字节数 d) 父进程中从管道读出数据,每次读 16k,打印出进程号、每次读出的字节数及读出的内容 e) 以 O_NDELAY 或 O_NONBLOCK 的方式向管道中写, ...
  • linux系统如何使用fork函数创建子进程

    万次阅读 多人点赞 2017-09-16 15:48:00
    系统调用函数fork()是创建一个新进程的唯一方式,fork()函数是Linux系统一个比较特殊的函数,其一次调用会有两个返回值。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程
  • fork创建进程

    2016-06-20 16:07:39
    /* 创建多进程fork函数,fork函数是创建调用的进程副本,并非根据完全不同的程序创建进程,而是复制正在运行的调用  * fork函数的进程。两个进程都执行fork函数调用后的语句。  * 父进程:fork函数返回子进程ID...
  • fork()创建子进程

    2020-05-10 12:21:49
    fork()是个特殊的函数,它用于创建子进程,有两个返回值,父进程中的返回值是一个非0的数,在子进程中的返回值是一个为0的数 p1=fork()使父进程创建了子进程,这时存在父进程和子进程两个进程,父进程继续执行时...
  • 前言:exce调用并不创建进程,所以前后的进程ID并未改变,exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段 多线程程序里不准使用fork :为什么??? UNIX上C++程序设计守则3 准则3:多线程...
  • Linux中fork()系统调用创建两个子进程

    千次阅读 多人点赞 2021-04-09 22:53:37
    使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h> int main(){ int fpid = fork(); if(fpid == 0){ printf("%d I am Child 1. My parent is %d\n",getpid(),getppid())...
  • 前言:exce调用并不创建进程,所以前后的进程ID并未改变,exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段 多线程程序里不准使用fork :为什么??? UNIX上C++程序设计守则3 准则3:多线程...
  • fork函数是Linux下一个近乎专有的C语言函数,因为使用时需要调用unistd.h这个头文件,这里我们就Linux环境下举例讲解C语言的fork()函数创建子进程的用法,需要的朋友可以参考下
  • ★实验 9-2 1. 补全代码,实现以下功能 a) 调用pipe()创建无名管道 ...d) 在子进程中调用execl()执行pipe_read e) pipe_read执行过程中读出管道中内容, 同时打印出PID、读出的字节数、读出的内容 // main.c #inclu
  • 用GDB跟踪fork创建父进程和子进程

    千次阅读 2015-04-05 09:01:18
    就像myKernel的进程调度那样,通过复制父进程的相关资源和进程信息来创建子进程。然后pid设置成0来区分父子进程。说来也巧,我的系统调用便是用了fork这个例子。当时我就很疑惑,看上去这个程序运行了两遍,正巧...
  • fork系统调用创建进程

    千次阅读 2014-11-19 16:38:55
    一、相关知识:当程序执行fork时,
  • 多进程编程---创建进程 头文件:#include<unistd.h> 创建一个新进程 :pid_t fork(void) 如果出错返回-1 fork 调用一次,两次返回... 新进程中返回0(子进程) (一)、举例,创建一个子进程,代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,962
精华内容 24,784
关键字:

在程序中调用fork创建子进程