2014-09-19 1 views
1

Я хочу запустить: cat somefile | program> outputText в системе UNIX.Использовать вывод cat в другой программе с трубой в C

Я рассмотрел многие вещи, такие как труба, используя popen, dup2 и т. Д .; Я потерян.

Базовый код должен быть:

  • Чтения любого выхода cat производит с помощью program и сделать некоторые магии, в то вывод данных в outputText.

Любые советы, пожалуйста?

P.S. Файлы представляют собой двоичные файлы.

UPDATE:

Я нашел этот код, который работает с заданной командой выше ... Но это делает вещи, которые я не хочу.

  1. Как избавиться от sort? Я пытался стереть вещи, но потом я получаю ошибки, и программа не запускается.
  2. данных, считанных cat как двоичный
  3. Выходные данные на терминал в виде двоичного

Любые советы, пожалуйста?

int main(void) 
{ 
    pid_t p; 
    int status; 
    int fds[2]; 
    FILE *writeToChild; 
    char word[50]; 

    if (pipe(fds) == -1) 
    { 
     perror("Error creating pipes"); 
     exit(EXIT_FAILURE); 
    } 

    switch (p = fork()) 
    { 
     case 0: //this is the child process 
      close(fds[1]); //close the write end of the pipe 
      dup2(fds[0], 0); 
      close(fds[0]); 
      execl("/usr/bin/sort", "sort", (char *) 0); 
      fprintf(stderr, "Failed to exec sort\n"); 
      exit(EXIT_FAILURE); 

     case -1: //failure to fork case 
      perror("Could not create child"); 
      exit(EXIT_FAILURE); 

     default: //this is the parent process 
      close(fds[0]); //close the read end of the pipe 
      writeToChild = fdopen(fds[1], "w"); 
      break; 
    } 

    if (writeToChild != 0) 
    { 
     while (fscanf(stdin, "%49s", word) != EOF) 
     { 
      //the below isn't being printed. Why? 
      fprintf(writeToChild, "%s end of sentence\n", word); 
     } 
     fclose(writeToChild); 
    } 

    wait(&status); 

    return 0; 
} 
+1

Почему бы вам использовать 'cat' к трубе в него, когда вы можете просто установить' 'stdin' из программы 'to' somefile'? то есть 'program < somefile > outputText' – FatalError

+0

Моя задача указывает, что я должен сделать это, к сожалению. – raffaello

+0

И файл, читаемый cat, является двоичным, и выход должен быть бинарным, если это возможно. – raffaello

ответ

0

Чтобы иметь возможность читать вывод (стандартный вывод) из cat, вам не нужно ничего трубы я нашел благодаря вам, ребята! Я отвлекся с трубопроводами ...

так что если вы запустите «cat некий-файл | program», где содержит некий-файл двоичных данных ... вы просто увидите все, что содержит некий-файл, перепечатано на терминале.

Спасибо! Теперь я могу закончить писать program.

/*program.c*/ 

int main() 
{ 
    int i, num; 

    unsigned char block[2]; 

    while ((num = fread(block, 1, 2, stdin)) == 2) 
    { 
     for(i = 0; i < 2; i++) 
     { 
      printf("%02x", block[i]); 
     } 
    } 

} 
1

Это мое предложение, как вы хотели читать и писать бинарные файлы:

#include <stdio.h> 

int main (void) { 
    if (!freopen(NULL, "rb", stdin)) { 
     return 1; 
    } 
    if (!freopen(NULL, "wb", stdout)) { 
     return 1; 
    } 

    char buf[4]; 
    while (!feof(stdin)) { 
     size_t numbytes = fread(buf, 1, 4, stdin); 

     // Do something with the bytes here... 

     fwrite(buf, 1, numbytes, stdout); 
    } 
} 
+0

Вот что я только что сделал :) .. Потратил время, чтобы понять, как сделать двоичный файл вывода stdout. Хотел бы я взглянуть на это 20 минут назад. – raffaello

+0

Проверка EOF не работает. Вы должны проверить 'feof()' после 'fread()', но перед 'fwrite()'. Или просто используйте возвращаемое значение 'fread()'. – FatalError

+0

@FatalError Из man-страницы 'fread':« Если произошла ошибка или достигнут конец файла, возвращаемое значение - короткий счетчик (или ноль) ». То есть 'numbytes' содержит количество фактически прочитанных байтов, даже если достигнуто' EOF'. Эти байты должны быть записаны. – Henrik