(在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

为什么会这样?

最佳答案

根据ISO C:
标准输入和标准输出是完全缓冲的,除非它们
指终端设备,在这种情况下,它们是线路缓冲的。
当您使用ST3时,它不引用终端设备,因此它是完全缓冲的这意味着hi\nbye\n将存储在缓冲区中,并且fork()将它们复制到子进程然后两者都会输出两次。
当您使用shell时,您使用的是一个终端设备,它是行缓冲的在thr执行过程中,hi\n将首先输出,缓冲区将由于\n而刷新然后将bye\n发送到缓冲区并输出两次。

关于c - 在Sublime Text 3中构建C文件并使用fork();,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28654142/

10-13 05:17