在Sublime Text 3中构建C文件并使用fork();

时间:2015-02-22 03:23:58

标签: c sublimetext3

(在mac上运行)我的C.sublime-build文件如下所示:

{
"cmd" : ["gcc -Wall -g $file_name -o ${file_base_name} && ./${file_base_name}"],
"selector" : "source.c",
"shell": true,
"working_dir" : "$file_path"
}

我有一个简单的程序,代码如下:

#include <stdio.h>
#include <unistd.h>

int main ( int argc, char *argv[] ) {
    printf("hi\n");
    fork();
    printf("bye\n");

    return 0;
}

和sublime将执行它并给我

hi
bye
hi
bye
从shell执行时,

给我正确的结果,

hi
bye
bye

为什么会这样?

2 个答案:

答案 0 :(得分:1)

当sublime执行它时,无论出于何种原因,stdout都不是使用行缓冲输出而是使用完全缓冲的输出。所以,当你fork()孩子时,&#34; hi \ n&#34;仍然存在于孩子的文件中。两个程序的输出仅在程序退出时刷新,并且它们都打印相同的输出。

答案 1 :(得分:1)

根据ISO C:

  

标准输入和标准输出是完全缓冲的,除非它们   指的是终端设备,在这种情况下,它们是行缓冲的。

当您使用ST3时,它不会引用终端设备,因此它是完全缓冲的。这意味着hi\nbye\n将存储在缓冲区中,fork()会将它们复制到子进程。然后它们都会输出两次。

当您使用shell时,您正在使用终端设备,并且它是行缓冲的。在thr执行期间,将首先输出hi\n,并且由于\n而刷新缓冲区。然后将bye\n发送到缓冲区并输出两次。