簡體   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