redirigir la salida estándar a finales de escritura de conducto
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?
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.