2016-04-13 58 views
0

Merhaba, c programımda bazı sorunlar yaşıyorum. Amaç, iki kez fork hedefidir ve daha sonra iki çocuğa bir çocuktan diğerine pipe ile bazı verileri ve daha sonra çocuktan ebeveyne bazı farklı verileri iletir ve sonunda ebeveyn olarak yazdırır. İşte benim kodudur:c fork pipe ve read fucntion dosya tanıtıcısından rastgele bir bayt verir

int main(void) 
{ 
    int f,f2,nread; 
    int pfd[2], pfd2[2]; 
    char buffer[512], *str; 

    if(pipe(pfd)==-1) { 
     errorHandler("pipe"); 
    } 

    if((f=fork())==-1) { 
     errorHandler("fork 1"); 
    } else if(f == 0) { 
     /*child 1*/ 
     if(pipe(pfd2)==-1) { 
      errorHandler("pipe 2"); 
     } 
     if((f2=fork())==-1) { 
      errorHandler("fork 2"); 
     } else if(f2 == 0) { 
      /*child 2*/ 
      close(pfd[0]); 
      close(pfd[1]); 
      close(pfd2[0]); 
      str = "rollin"; 
      printf("-child 2 writing: %s\n", str); 
      if(write(pfd2[1], &str, BUFFSIZE)==-1) { 
       errorHandler("write 2"); 
      } 
     } else { 
      /*child 1*/ 
      close(pfd[0]); 
      close(pfd2[1]); 
      if((nread=read(pfd2[0], &buffer, 512))==-1) { 
       errorHandler("read child 1"); 
      } 

      buffer[nread] = 0; 
      printf("child 1 read data %d [%s]\n", nread, buffer); 

      str = "patrollin patrolling hehe"; 
      printf("-child 1 writing %s\n", str); 
      if(write(pfd[1], &str, BUFFSIZE)==-1) { 
       errorHandler("write"); 
      } 
     } 
    } else { 
     /*parent*/ 
     close(pfd[1]); 
     if((nread=read(pfd[0], buffer, sizeof(buffer)))==-1) { 
      errorHandler("read"); 
     } else { 
      buffer[nread] = 0; 
      printf("parent read data: %d [%s]\n", nread, buffer); 
     } 
    } 

    return 0; 
} 

çıkış verisi okunur (belirttiğim 512 bayt gibi) ama ben ne göndermiş olmadığıdır. Bunun yerine bellekten rastgele işaretler alıyorum (dosya tanıtıcıları düzgün bir şekilde pırasalandırılıyor, değil mi?). Buraya gelmemin sebebi, bunun nesi yanlış olduğunu anlayamıyorum. Sadece bir çatal ve benzer bir eylem ile bir programım var ve aynı tekniklere dayanıyor ve çalışıyor. Herkes bana bir ipucu verebilir mi, ne yapıyorum yanlış?

cevap

0

read numaralı ikinci argüman, arabelleğin bir göstericisidir. write'a yapılan ikinci argüman, yazılacak verilere işaret eder. Yani

read(pfd2[0], buffer, 512) 

ve

write(pfd2[1], str, BUFFSIZE) 
kullanmalıdır