zoukankan      html  css  js  c++  java
  • fork最简单的例程

    /* ************************************************************************
    * Filename: exit.c
    * Description:
    * Version: 1.0
    * Created: 2011年05月11日 17时18分52秒
    * Revision: none
    * Compiler: gcc
    * Author: wenhao (wh), hnrain1004@gmail.com
    * Company: sunplusapp
    * ***********************************************************************
    */


    #include
    <stdio.h>
    #include
    <stdlib.h>
    #include
    <unistd.h>
    #include
    <pthread.h>
    int main(int argc, char *argv[])
    {
    pid_t fd;

    printf(
    "hello world1!");//这里要注意,没有'\n'

    if((fd = fork()) == -1)
    {
    perror(
    "fork:");
    exit(EXIT_FAILURE);
    }
    else if(fd == 0)
    {
    printf(
    "hello world2!");
    exit(
    0);
    }
    else
    {
    wait(fd);
    exit(
    0);
    }
    }

    输出结果:

    预期hello world1!只输出一次,可是,现在输出了两次.

    原因:

    printf("hello world1!");如果在后面加一个\n的话,结果就是我们想要的了.

    要注意的两个知识点:
    1.printf是一个以行缓冲的方式输出内容的, 也就是printf输出时会将要输出的内容存放在缓冲区中,当缓冲区满或遇到\n时才会输出.
    2.fork()建立子进程时,子进程会继承父进程的数据段,BSS段,代码段,堆空间,栈空间和文件符,而对于文件描述符关联的内核文件表项,采用的是共享的方式.

    了解了这两个知识点,我们就来解释为什么会出现两个hello world1!
    因为
    printf("hello world1!");没有立刻输出,所以他会存放在缓冲区中,这个缓冲区也被子进程继承了,所以第一个hello world1!是子进程输出的,第二个hello world1!才是父进程输出的.
  • 相关阅读:
    em与rem之间的区别以及移动设备中的rem适配方案
    关于两个DIV之间的空白字符
    Bootstrap基本模板
    js 裁剪
    记一次诡异的bug
    Node切换版本
    git 撤销
    使用 iframe + postMessage 实现跨域通信
    <el-input>标签限制输入小数点
    vue elementyUI table :点击一行时选中这一行对应的复选框
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2043501.html
Copyright © 2011-2022 走看看