在bash中重定向stdout与使用fprintf(速度)在c中写入文件

时间:2015-04-17 13:23:12

标签: c bash printf stdout

我想知道哪个选项基本上更快。

最让我感兴趣的是重定向机制。我怀疑该文件在程序./program > file开始时打开,并在结束时关闭。因此,每当程序输出一些东西时,它应该只是写入文件,就像听起来一样简单。是这样吗?然后我猜两种选择在速度方面都应该具有可比性。

或许这是一个更复杂的过程,因为操作系统必须执行更多操作?

3 个答案:

答案 0 :(得分:5)

这些选项之间没有太大区别(除了将文件作为严格选项降低了程序的灵活性)。 为了比较这两种方法,让我们检查一下神奇实体FILE*背后的内容:

因此,在这两种情况下,我们都有一个FILE*对象,一个文件描述符 fd - 一个通往操作系统内核和内核基础结构的网关,提供对文件或用户终端的访问,应该(除非libc有一些特殊的初始化器用于stdout或内核专门处理fd = 1的文件)。

fopen()相比,bash重定向如何工作?

当bash重定向文件时:

fork()                      // new process is created
fd = open("file", ...)      // open new file
close(1)                    // get rid of fd=1 pointing to /dev/pts device
dup2(fd, 1)                 // make fd=1 point to opened file
close(fd)                   // get rid of redundant fd
execve("a")                 // now "a" will have file as its stdout
// in a
stdout = fdopen(1, ...)

当您自己打开文件时:

fork()                           // new process is created
execve("a")                      // now "a" will have file as its stdout
stdout = fdopen(1, ...)         
my_file = fopen("file", ...)     
    fd = open("file", ...)
    my_file = fdopen(fd, ...)

正如您所看到的,主要的bash区别在于文件描述符。

答案 1 :(得分:3)

是的,你是对的。速度是一样的。这两种情况的唯一区别是哪个程序打开并关闭文件。当您使用shell重定向它时,它是打开文件的shell,并使该句柄可用作程序的stdout。当程序打开文件时,程序会打开文件。之后,在两种情况下句柄都是文件句柄,所以速度应该没有区别。

作为旁注,可以以更一般的方式使用写入stdout的程序。例如,你可以说

./program | ssh remotehost bash -c "cat > file"

将导致程序的输出写入file上的remotehost。当然,在这种情况下,没有像你在问题中所做的那样进行比较。

答案 2 :(得分:2)

stdoutFILE句柄,fprintf写入文件句柄,因此在两种情况下速度都非常相似。实际上printf("Some string")相当于fprintf(stdout, "Some string")。我不会再说了:))