Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将管道从文件重定向到屏幕linux c_C_Linux_File_Pipe - Fatal编程技术网

将管道从文件重定向到屏幕linux c

将管道从文件重定向到屏幕linux c,c,linux,file,pipe,C,Linux,File,Pipe,我在网上找到了以下代码 FILE *fp; fp=fopen("text.txt","w"); int fd=open("text.txt",O_WRONLY,S_IWUSR); dup2(fd,1); 此代码将管道从屏幕重定向到名为text.txt的文件。 现在我需要做相反的事情。我想将管道写入从该文件更改为屏幕。 有人有主意吗?谢谢这段代码之所以有效,是因为有什么东西正在将数据推入管道。如果你只是简单地颠倒guzintas和comzoutas的接线,情况就不会是这样了。您需要打开文本文件进

我在网上找到了以下代码

FILE *fp;
fp=fopen("text.txt","w");
int fd=open("text.txt",O_WRONLY,S_IWUSR);
dup2(fd,1);
此代码将管道从屏幕重定向到名为text.txt的文件。 现在我需要做相反的事情。我想将管道写入从该文件更改为屏幕。
有人有主意吗?谢谢

这段代码之所以有效,是因为有什么东西正在将数据推入管道。如果你只是简单地颠倒guzintas和comzoutas的接线,情况就不会是这样了。您需要打开文本文件进行读取,然后将文件读入内存并写入屏幕。有很多关于cat.exe克隆的源代码示例,请在GitHub上查找代码

下面是一个非常简单的示例:

#include <stdio.h>

void spewfile(FILE *fp)
{
  char buf[BUFSIZ];

  while(fgets(buf, sizeof(buf), fp))
    fputs(buf, stdout);
}

在Linux上,您可以写入/dev/tty,但这并不等同于恢复对stdout的写入,因为您可能无法重定向调用程序的输出不确定-待测试,顺便说一句,我不确定这是否可移植到其他基于Unix的系统

int fd=open("/dev/tty",O_WRONLY);
dup2(fd,1);
否则,您应该在第一次重定向之前将文件描述符1复制到另一个描述符,以便以后能够恢复它

/* save fd 1 */
int sav=dup(1);

/* redirect to file */
int fd=open("text.txt",O_WRONLY,S_IWUSR);
dup2(fd,1);

/* done anything you wanted here (redirected to text.txt) */
/* ... */

/* revert redirection */
dup2(sav,1);

/* do anything you want here (having reverted the redirection back to stdout) */
/* ... */

顺便说一句,我们应该避免同时使用缓冲fopen和非缓冲openi/O。这将导致问题,因为缓冲I/O不会被告知您在使用非缓冲I/O的同时所做的事情。

发布的代码中没有“管道”。但是,标准输入/输出流从终端到文件会发生一些变化。管道是指当您使用管道时,一种特殊的fifo类型的文件,在两段代码之间可能没有名称。在这里,你所做的是重定向。是的,你是对的,也许我没有像应该的那样解释,我的问题是我想将输出重定向回stdout屏幕。包含未使用的头文件是一种糟糕的编程实践。在这种情况下,建议删除这两条语句:include和include I可能更容易处理cat文本。txt@Camion同意,但我认为OP给人的印象是,他们可以以某种方式逆转控制台到文件示例中的重定向,并将文件转到控制台,如果文件不是一个管道,有什么东西将数据推入其中,那么这根本不起作用。我只是想展示一个例子,说明如何成功地将位从文件推送到控制台。在这种情况下,究竟是什么原因导致text.txt输出被推送到标准输出?如果您的程序将其输出从外部定向到text.txt,即my_program>text.txt,第一种情况将强制其输出到screenNo,OP的原始代码将控制台输入定向到text.txt,他们希望反转该流程。您的程序是如何从text.txt读取数据并在标准输出上显示的?这是您的解释,但问题中没有明确说明。他从未说过他想读取发送到文件的输出,他说他想反转先前发送到文件的输出的重定向。在我看来,有两种不同的情况:初始重定向是在程序外部进行的,或者是在程序内部进行的。我认为您的代码会写入text.txt,这正是OP已经知道的。它们清楚地表明希望在屏幕上显示文本文件内容。