C перенаправление stdout в файл с предопределенным сообщением - PullRequest
1 голос
/ 02 ноября 2019

Я хочу продублировать сообщение, которое печатается в stdout, когда я нажимаю регистр 's', в открытый файл для регистра 'f', используя dup () и dup2 ().

Я не уверен, как работают системные вызовы dup и как я могу скопировать stdout в файл. Я знаю, что мне придется использовать dup, чтобы захватить то, на что указывает stdout, а затем использовать dup2 для переключения между экраном и файлом.

Вот мой код:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>

#define BUFFER_SIZE 128
#define PERMS 0666

int main(int argc, char *argv[])
{
    char outBuffer[BUFFER_SIZE] = "This is a message\n";
    int count;
    int fd;
    char input =0;
    int a;

    if(argc!=2){
        printf("Provide an valid file as an argument\n");
        exit(1);
    }

    if((fd = open(argv[1],O_CREAT|O_WRONLY|O_APPEND,PERMS)) == -1)
    {
        printf("Could not open file\n");
        exit(1);
    }

printf("0 to terminate, s to write to stdout, f to write to file\n");
        do{
        scanf(" %c", &input);
        switch(input)
        {

            case 'f':

            case 's':
            write(1,outBuffer,strlen(outBuffer));
            break;

            default:
            printf("Invalid Choice\n");

         }
     }while(input != '0');

     close(fd);
     return 0;
}

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Системный вызов dup дублирует файловый дескриптор, который создает второй дескриптор для программы, чтобы записывать туда, где подключен первый.

Он не дублирует любую выполняемую операциюна канале ввода / вывода. Если вы хотите этого, вам придется сделать две (или более) записи.

0 голосов
/ 02 ноября 2019

Рассмотрите возможность использования программы 'tee' (конвейер для дочернего процесса), которая может отправлять стандартный вывод в файл.

   case 'f':
      pipe fd2[2] ;
      pipe(fd2) ;
      if (  fork() > 0 ) {
          // Child
          dup2(fd[0], 0) ;
          close(fd[1]) ;
          close(
          // create command line for 'tee'
          char teecmd[256] ;
          sprintf(teecmd, "...", ...) ;
          execlp(teecmd) ;
      } ;
      // Parent
      fd = fd[1] ;
      close(fd[0]) ;
      ...
...