Frage

Ich bin ein kleines Programm zu schreiben, und hier ist das, was es tun soll.

Im Hauptprozess Ich habe einen neuen zu schaffen, und dass man ein anderes Programm ausführen soll, die nur eine printf tut ( „text“). Ich möchte das Rohr Schreibende auf stdout und dem Hauptprozess umgeleitet werden sollte, von seinem Rohr Lese lesen und es auf stdout drucken. Ich schrieb den Code aber immer wieder ich einen Segmentation Fault erhalten, wenn die übergeordneten Prozess versucht aus dem Rohr zu lesen.

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

Muss ich das Rohr Schreibende zu schließen, wenn ich stdout es umleiten?

War es hilfreich?

Lösung

Ähm, ... der Grund für Ihre Segmentierungsfehler ist hier:

buf = fgets(p,30,pipe_read);

p ist ein Zeiger auf im Wesentlichen des Nichts von Bedeutung. Es ist Inhalt ist, was zum Zeitpunkt der Ausführung in dem Stapel ist, initialisieren Sie es nie. Sie müssen es Punkt auf einen Teil des Speichers können Sie nutzen! Weisen Sie die Rückkehr eines malloc() Anruf es, oder erklären ihn als char p[LEN].

Edit: Sie sind auch bereits geöffnete Dateibeschreibungen wieder zu öffnen. Überprüfen Sie die Dokumentation auf fgets und pipe, ich glaube, Sie sind verwirrt, wie sie funktionieren.

Nun, das sagte, wird der Fluss Ihrer Funktion ein bisschen verwirrend. Versuchen Sie, auf die Klärung es funktioniert! Denken Sie daran, Code soll Absichten auszudrücken, Ideen der Funktionalität. Versuchen Sie sich mit Bleistift und Papier zu Ihrem Programm zu organisieren, und dann schreiben Sie es als tatsächlicher Code:.)

Cheers!

Andere Tipps

  

Muss ich das Rohr Schreibende zu schließen, wenn ich stdout es umleiten?

In der Regel ja, weil während es einen Prozess mit dem Schreibende des Rohres geöffnet ist, werden die Prozesse Lesen Sie das Rohr nicht EOF erhalten und wird hängen. Es ist auch ordentlich zu schließen Filedeskriptoren Sie sind nicht auf den Einsatz gehen, natürlich.

Ihr Code sagt auch in dem Erfolgspfad "Pipe konnte nicht erstellt werden".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top