Pregunta

Estoy escribiendo un pequeño programa, y ??esto es lo que debe hacer.

En el proceso principal que tengo para crear uno nuevo y que se debe ejecutar otro programa que sólo hace un printf ( "texto"). Quiero volver a dirigir el extremo de escritura tubería en la salida estándar y el proceso principal debe leer desde su lectura tubería y e imprimirla en la salida estándar. Escribí el código, pero una y otra vez me sale un error de segmentación cuando los intentos proceso padre para leer de la tubería.

#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);
  }
}

¿Tengo que cerrar el extremo del tubo de escritura cuando vuelvo a dirigir la salida estándar a ella?

¿Fue útil?

Solución

Uhm, ... el motivo de la violación de segmento está aquí:

buf = fgets(p,30,pipe_read);

p es un puntero a ninguna parte esencialmente de importancia. Es el contenido es lo que está en la pila en el momento de la ejecución, nunca se inicialice. Que lo necesite a punto a un trozo de memoria que puede utilizar! Asignar el retorno de una llamada malloc() a la misma, o declarar como char p[LEN].

Editar: también está reabriendo ya descriptores de ficheros abiertos. Consulte la documentación de fgets y pipe, creo que usted está confundido en cuanto a cómo funcionan.

Ahora, dicho esto, el flujo de su función está un poco confuso. Trate de trabajar en la clarificación de él! Recuerde, el código está destinado a expresar intenciones, ideas de funcionalidad. Trate de usar lápiz y papel para organizar su programa, y ??luego escribir como código real:.)

Saludos!

Otros consejos

  

¿Tengo que cerrar el extremo del tubo de escritura cuando vuelvo a dirigir la salida estándar a ella?

En general, sí, porque si bien hay un proceso con el fin de escritura de la tubería abierta, los procesos de lectura de la tubería no llegar EOF y se colgará. También es ordenado a cerrar los descriptores de archivo que no se va a utilizar, por supuesto.

El código también dice "tubería no se pudo crear" en el camino de éxito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top