繁体   English   中英

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

[英]Redirecting pipe from file to screen linux c

我有以下代码(在互联网上找到)

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)和未缓冲的(开放)I / O。 这将导致问题,因为没有通知缓冲的I / O您同时使用无缓冲的I / O会执行的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM