0

私は小さなプログラムを書いています、そしてこれがそれがすべきことです。

メインプロセスでは、新しいプログラムを作成する必要があり、そのプログラムはprintf( "text")のみを実行する別のプログラムを実行する必要があります。パイプの書き込み終了をstdoutにリダイレクトしたいのですが、メインプロセスはパイプの読み取りから読み取り、stdoutに出力する必要があります。コードを記述しましたが、親プロセスがパイプから読み取ろうとすると、セグメンテーション違反が何度も発生します。

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

stdoutをパイプにリダイレクトするときに、パイプの書き込み終了を閉じる必要がありますか?

4

2 に答える 2

2

ええと、...セグメンテーション違反の理由はここにあります:

buf = fgets(p,30,pipe_read);

pは、本質的に重要な場所へのポインタです。その内容は、実行時にスタックにあるものであり、初期化することはありません。使用できるメモリのチャンクを指すために必要です!呼び出しの戻りをそれに割り当てるmalloc()か、またはとして宣言しchar p[LEN]ます。

編集:すでに開いているファイル記述子も再度開きます。とのドキュメントを確認してください。それらがどのように機能するかについて混乱しているfgetspipe思います。

さて、そうは言っても、あなたの関数の流れはちょっと混乱しています。それを明確にするために取り組んでみてください!コードは、機能の意図やアイデアを表現するためのものであることを忘れないでください。鉛筆と紙を使ってプログラムを整理し、実際のコードとして書いてみてください:)。

乾杯!

于 2010-11-26T20:23:13.647 に答える
2

stdoutをパイプにリダイレクトするときに、パイプの書き込み終了を閉じる必要がありますか?

一般に、はい。パイプの書き込み端が開いているプロセスがある間、パイプを読み取るプロセスはEOFを取得せず、ハングします。もちろん、使用しないファイル記述子を閉じることもできます。

コードには、成功パスに「パイプを作成できませんでした」と記載されています。

于 2010-11-26T20:37:06.923 に答える