перенаправление stdout в конец записи канала - PullRequest
0 голосов
/ 26 ноября 2010

Я пишу небольшую программу, и вот что она должна делать.

В основном процессе мне нужно создать новую программу, и что нужно выполнить другую программу, которая выполняет только printf ("текст").Я хочу перенаправить конец записи канала на стандартный вывод, и основной процесс должен прочитать его из чтения канала и распечатать его на стандартный вывод.Я написал код, но снова и снова я получаю ошибку сегментации, когда родительский процесс пытается читать из канала.

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

void write_to(FILE *f){
  char buf[50];
  fprintf(f,"KOMA");
}

int main(){
  int cpPipe[2];
  int child1_fd;
  int child2_fd;

  if(pipe(cpPipe) == -1){

    fprintf(stderr,"ERROR PIPE creation");
    exit(1);

  }else{printf("pipe couldn't be created\n");}

  child1_fd = fork();

  if(child1_fd < 0){
    fprintf(stderr, " CHILD creation error");
    exit(1);
  }

  if(child1_fd == 0){
    printf("*CHILD*\n");
    char program[] = "./Damn";
    int dupK;
    printf("stdout %d \n", STDOUT_FILENO);
    printf("stdin %d \n", STDIN_FILENO);
    printf("pipe1 %d \n", cpPipe[1]);
    printf("pipe0 %d \n", cpPipe[0]);

    // closing pipe write
    close(cpPipe[0]);
    close(1);
    dup(cpPipe[1]);

    printf("and");

    close(cpPipe[1]);
    exit(0);
  }else{
    printf("*Parent*\n");
    char *p;
    char *buf;
    FILE *pipe_read;

    close(cpPipe[1]);
    pipe_read = fdopen(cpPipe[0],"r");

    while((buf = fgets(p,30,pipe_read)) != NULL){
      printf("buf %s \n", buf);
    }

    wait();
    printf("Child is done\n");
    fclose(pipe_read);

    exit(0);
  }
}

Нужно ли закрывать конец записи канала, когда я перенаправляю на него стандартный вывод?

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Нужно ли закрывать конец записи канала, когда я перенаправляю на него стандартный вывод?

В общем, да, потому что пока существует процесс с открытым концом записи каналапроцессы, читающие канал, не получат EOF и будут зависать.Конечно, также аккуратно закрывать файловые дескрипторы, которые вы не собираетесь использовать.

В вашем коде также сказано, что "путь не может быть создан" в успешном пути.

2 голосов
/ 26 ноября 2010

Хм, ... причина вашей ошибки сегментации здесь:

buf = fgets(p,30,pipe_read);

p - указатель, по сути, ни на что не похожий.Это содержимое того, что находится в стеке во время выполнения, вы никогда не инициализируете его.Вам нужно указать на часть памяти, которую вы можете использовать!Назначьте возврат вызова malloc() или объявите его как char p[LEN].

Редактировать: вы также открываете уже открытые дескрипторы файлов.Посмотрите документацию по fgets и pipe, я думаю, вы не понимаете, как они работают.

Теперь, несмотря на это, поток вашей функции немного запутан.Попробуйте работать над разъяснением этого!Помните, что код предназначен для выражения намерений, идей функциональности.Попробуйте использовать карандаш и бумагу для организации вашей программы, а затем напишите ее в виде реального кода:).

Cheers!

...