在 Sublime Text 3 中构建 C 文件并使用 fork();
Building C file in Sublime Text 3 and using fork();
(运行 on a 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
为什么会这样?
可能是当 sublime 执行它时,无论出于何种原因,stdout 都没有使用行缓冲输出,而是使用完全缓冲输出。因此,当您 fork() child 时,"hi\n" 仍然驻留在 child 的文件中。两者的输出仅在程序退出时刷新,并且它们都打印相同的输出。
根据 ISO C:
Standard input and standard output are fully buffered, unless they
refer to a terminal device, in which case, they are line buffered.
当您使用 ST3 时,它不是指终端设备,因此它是完全缓冲的。这意味着 hi\n
和 bye\n
将存储在缓冲区中, fork()
将它们复制到子进程。那么两者都会输出两次。
当您使用 shell 时,您使用的是终端设备并且它是行缓冲的。在thr执行过程中,先输出hi\n
,然后由于\n
刷新缓冲区。然后bye\n
送入缓冲区,输出两次
(运行 on a 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
为什么会这样?
可能是当 sublime 执行它时,无论出于何种原因,stdout 都没有使用行缓冲输出,而是使用完全缓冲输出。因此,当您 fork() child 时,"hi\n" 仍然驻留在 child 的文件中。两者的输出仅在程序退出时刷新,并且它们都打印相同的输出。
根据 ISO C:
Standard input and standard output are fully buffered, unless they refer to a terminal device, in which case, they are line buffered.
当您使用 ST3 时,它不是指终端设备,因此它是完全缓冲的。这意味着 hi\n
和 bye\n
将存储在缓冲区中, fork()
将它们复制到子进程。那么两者都会输出两次。
当您使用 shell 时,您使用的是终端设备并且它是行缓冲的。在thr执行过程中,先输出hi\n
,然后由于\n
刷新缓冲区。然后bye\n
送入缓冲区,输出两次