C 同时写入两个流

C 同时写入两个流,c,linux,io,stream,C,Linux,Io,Stream,有没有一种方法可以将两个流(或文件描述符)耦合在一起,这样写入一个流也会写入第二个流?(C、Linux) 谢谢。您可以使用实现类似于tee的功能。不确定这是否是您想要的,但unix中的“tee”也有类似的功能。我想到的第一件事也是“tee”。那么,让我们将C和shell与popen结合起来: FILE * multi_out; multi_out = popen( "tee file1.out > file2.out", "w"); /* error checks, actual wor

有没有一种方法可以将两个流(或文件描述符)耦合在一起,这样写入一个流也会写入第二个流?(C、Linux)


谢谢。

您可以使用实现类似于
tee
的功能。

不确定这是否是您想要的,但unix中的“tee”也有类似的功能。

我想到的第一件事也是“tee”。那么,让我们将C和shell与popen结合起来:

FILE * multi_out;

multi_out = popen( "tee file1.out > file2.out", "w");
/* error checks, actual work here */
pclose( multi_out);
/* error checks here */

作为一个Unix顽固分子,我假设您没有在Windows上尝试此操作。

使用
funopen
fwopen
并提供您自己的写入函数,用于写入多个
文件*
s

例如:

FILE *files[2] = ...;

FILE *f = fwopen((void *)files, my_writefn);

// ... use f as you like ...

int my_writefn(void *cookie, const char *data, int n) {
  FILE **files = (FILE **)cookie;
  fwrite(data, n, 1, files[0]);
  return fwrite(data, n, 1, files[1]);
}
(省略错误处理。)


请注意,
funopen
fwopen
是BSD,不在标准Linux中。我不知道是否有与Linux兼容的等效程序。

用户laalto是正确的,但在Linux上,您正在寻找的函数名为
fopencookie
。更正laalto的Linux示例会导致:

int my_writefn(void *cookie, const char *data, int n) {
  FILE **files = (FILE **)cookie;
  fwrite(data, n, 1, files[0]);
  return fwrite(data, n, 1, files[1]);
}

int noop(void) { return 0; }
cookie_io_functions_t my_fns = {
  (void*) noop,
  (void*) my_writefn,
  (void*) noop,
  (void*) noop
};

FILE *files[2] = ...;

FILE *f = fopencookie((void *)files, "w", my_fns);

// ... use f as you like ...
当您写入
f
时,系统将执行
my_writefn
函数,将传递给
fwrite
的数据传递给它。为了简化操作,您可能还希望将文件流的缓冲更改为面向行:

setvbuf(f, NULL, _IOLBF, 0);
这将缓冲传递给
fwrite
的数据,直到输出换行符或从附加到进程(例如stdin)的任何流中读取任何数据注意:您必须在
fopencookie
之后但在任何数据写入流之前调用
sevbuf


我使用行缓冲是因为我通常使用
fopencookie
将stderr重定向到syslog,或者通过网络套接字,处理面向行的数据更容易、更有效。

你有C语言的例子吗?因为这是严格的C++;显然,没有。手册页中没有(至少在我的系统上没有)。funopen在BSD和Mac OS X上。在Linux上使用fopencookie。@mark4o:谢谢你提供的信息@杰克:似乎使用fopencookie()的实现会非常相似。这里没有更新我的答案,但你应该有一些前进的指针。这节省了计算机时间。我不确定这是否能节省程序员的时间。不过,这是一个很好的技巧(即使不是完全可移植的,where portable=“inter unices”)。所以“C++”的家伙会被修改,但你会因为建议“建立在他人的工作之上”而被修改。这是不对的…这样我们也可以写入两个以上的文件。只是球座使用技巧的问题。裁判。