إعادة توجيه stdout إلى نهاية كتابة الأنابيب

StackOverflow https://stackoverflow.com/questions/4288044

  •  28-09-2019
  •  | 
  •  

سؤال

أنا أكتب برنامجًا صغيرًا ، وهنا ما ينبغي فعله.

في العملية الرئيسية ، يجب أن أقوم بإنشاء برنامج جديد ويجب أن يقوم المرء بتنفيذ برنامج آخر يقوم فقط بطباعة ("نص"). أرغب في إعادة توجيه نهاية كتابة الأنابيب على 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 إليها؟

هل كانت مفيدة؟

المحلول

uhm ، ... سبب خطأ التجزئة الخاص بك هنا:

buf = fgets(p,30,pipe_read);

P هو مؤشر إلى حد ما في مكان الأهمية. إنه المحتوى هو كل ما هو موجود في المكدس وقت التنفيذ ، فأنت لا تهيئته أبدًا. أنت بحاجة إلى الإشارة إلى جزء من الذاكرة يمكنك استخدامها! تعيين عودة أ malloc() اتصل به ، أو أعلن ذلك كـ char p[LEN].

تحرير: أنت أيضًا تعيد فتح واصفات الملفات المفتوحة بالفعل. تحقق من الوثائق في fgets و pipe, ، أعتقد أنك مرتبك فيما يتعلق بكيفية عملهم.

الآن ، ومع ذلك ، فإن تدفق وظيفتك أمر محير. حاول العمل على توضيح ذلك! تذكر أن الكود يهدف إلى التعبير عن النوايا وأفكار الوظيفة. حاول استخدام القلم الرصاص والورق لتنظيم البرنامج الخاص بك ، ثم اكتبه كرمز فعلي :).

هتافات!

نصائح أخرى

هل يجب علي إغلاق نهاية كتابة الأنابيب عندما أقوم بإعادة توجيه stdout إليها؟

بشكل عام ، نعم ، لأنه على الرغم من وجود عملية مع نهاية الكتابة من الأنبوب مفتوح ، فإن العمليات القراءة للأنبوب لن تحصل على EOF وستعلق. من المرتبة أيضًا إغلاق واصفات الملفات التي لن تستخدمها ، بالطبع.

يقول الرمز الخاص بك أيضًا "لا يمكن إنشاء الأنابيب" في مسار النجاح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top