Перенаправьте stdin в программе C к другому процессу

У меня есть программа C, и я хотел бы иметь ее, фильтруют весь ее вход с TR Так, я хотел бы запустить TR как дочерний процесс, перенаправить мой stdin к ней, затем получил бы stdout TR и читал бы из этого.

Править: вот код, который я имею до сих пор, который не работает. Это segfaults немедленно, но я не понимаю почему:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv){
  int ch;
  int fd = stripNewlines();

  while((ch = getc(fd)) != EOF){
    putc(ch, stdout);
  }

  return 0;
}

int stripNewlines(){
  int fd[2], ch;
  pipe(fd);

  if(!fork()){
    close(fd[0]);

    while((ch = getc(stdin)) != EOF){
      if(ch == '\n'){ continue; }
      putc(ch, fd[1]);
    }

    exit(0);
  }else{
    close(fd[1]);

    return fd[0];
  }
}

Править: Оказывается, что это было двумя вещами: каждый был тем моим заголовком, не определил stdin и stdout как 0 и 1, таким образом, я на самом деле читал/писал в полностью случайные каналы. Другой то, что по некоторым причинам getc и putc не работают, как я ожидал бы, таким образом, я должен был использовать чтение () и запись () вместо этого. Если я делаю это, это прекрасно:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv){
  int ch;
  int fd = stripNewlines();

  while(read(fd, &ch, 1) == 1){
    write(1, &ch, 1);
  }

  return 0;
}

int stripNewlines(){
  int fd[2];
  int ch;
  pipe(fd);

  if(!fork()){
    close(fd[0]);

    while(read(0, &ch, 1) == 1){
      if(ch == '\n'){ continue; }
      write(fd[1], &ch, 1);
    }

    exit(0);
  }else{
    close(fd[1]);
    return fd[0];
  }
}
6
задан Ross Andrews 22 April 2010 в 04:26
поделиться

4 ответа

Чтение его из stdin усложняет жизнь. Если вы можете жить с чтением из другого ФАЙЛА * , довольно просто использовать popen () для создания tr и чтения из ФАЙЛА * он возвращается.

Изменить: если вы не можете этого сделать, тогда вам нужно немного уродиться. Начните с использования popen для порождения tr с перенаправлением его вывода. Затем используйте fileno , чтобы получить номера файлов, связанных с этим FILE * и с stdin . Наконец, используйте dup2 , чтобы связать файловый дескриптор stdin с конвейером из tr .

1
ответ дан 17 December 2019 в 20:30
поделиться

См. popen (3) . В основном все, что вам нужно сделать, это

FILE *in = popen("tr <args>", "r");

, а затем прочитать из в .

1
ответ дан 17 December 2019 в 20:30
поделиться

Есть ли причина, по которой вы просто не можете передать входные данные tr в свою программу?

tr A-Z a-z | myprogram

0
ответ дан 17 December 2019 в 20:30
поделиться
#include <stdio.h>
int main()
{
    char x1[100];
    scanf("%[^\n]",x1); // read entire line from tr i.e., from stdin
    printf("\n%s",x1);
}

и используйте

tr A-Z a-z | myprogram

0
ответ дан 17 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: