2016-03-24 25 views
0

İki program arasında, read.c ve writer.c arasında c borusu oluşturmaya çalışıyorum. Boru programının çalışması için gerekli girişi alamadım. Boru programının bir int alması, yazıcı programına gönderilmesi ve daha sonra çıktılarının okuyucuya nihai çıktı için okuyucu programına aktarılması gerekiyor. Aşağıda üç sınıf için kod var. Sanırım yakınım ama birisi bana ilk int giriş argvunu [2] yazar sınıfına daha sonra okuyucu sınıfına getirmeme yardım edebilir mi?İki program arasında c olarak bir boru oluşturma

boru programı (communicat.c)

int main(int argc, char *argv[]) 
{ 
    int fd[2]; 
    pid_t childpid; 
    int result; 

    if (argc != 2) 
    { 
      printf("usage: communicate count\n"); 
      return -1; 
    } 
    pipe(fd); 

    childpid = fork(); 

    if (childpid == -1) 
    { 
     printf("Error in fork; program terminated\n"); 
     return -1; 
    } 

    if(childpid == 0) 
    { 
      close(1); 
      dup(fd[1]); 
      execlp("writer", "writer", fd[1],(char *) NULL); 
    } 
    else 
    { 
      childpid = fork(); 
    } 
    if(childpid == 0) 
    { 
      close(0); 
      dup(fd[0]); 
      close(fd[0]); 
      close(fd[1]); 
      execlp("reader", "reader", (char *) NULL); 
    } 
    else 
    { 
      close(fd[0]); 
      close(fd[1]); 
      int status; 
      wait(&status); 
    } 
    return(0); 
} 

Reader.c

int main() 
{ 
    int count; /* number of characters in the line */ 
    int c; /* input read */ 
    count = 0; 
    while ((c = getchar())!= EOF) 
    { 
     putchar(c); count++; 
     if (count == LINELENGTH) 
     { 
       putchar('\n'); count = 0; 
     } 
    } 
    if (count > 0) 
     putchar('\n'); 
    return 0; 
} 

Writer.c doğru

int main(int argc, char *argv[]) 
{ 
    int count; /* number of repetitions */ 
    int i; /* loop control variable */ 

    if (argc != 2) 
    { 
     printf("usage: writer count\n"); 
     return -1; 
    } 
    else count = atoi(argv[1]); 

    for (i = 0; i < count; i++) 
    { 
     printf("Hello"); 
     printf("hello"); 
    } 
    return 0; 
} 
+0

Okuyucu için yaptığınız gibi yazarın yazılmasından önce neden boru dosyalarını kapatmıyorsunuz? – jdarthenay

+0

Ayrıca okuyucu ve yazar arama programın argk ve argv'sine erişemez, ne aldıklarını 'exec()' fonksiyonuna bağlıdır. – jdarthenay

cevap

1

yazara bu şekilde exec kodu:

if(childpid == 0) 
{ 
    close(1); 
    dup(fd[1]); 
    close(fd[0]); 
    close(fd[1]); 
    execlp("writer", "writer", argv[1], (char *) NULL); 
} 
+0

Teşekkür ederim, yazarın fd kapanışını işe yaradı. Bunun gibi küçük bir şey olduğunu biliyordum. – Ryan

İlgili konular