2016-12-22 5 views
0

私は現在、名前付きパイプを通じて通信する4つのプロセスを含むプロジェクトに取り組んでいます。しかし、私はいつも期待している結果を得ることはありません。作者はプロセスのpidに等しいintを送信しています。ここで Cで名前付きパイプが更新されました。私が期待しているものをいつも得ることができない

は、私は私の問題を説明するために作られた短い実行可能コードです:

#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <sys/stat.h> 

int main(void){ 
int i, j, k, pid; 
int childs = 4; 
int size = 16; 
char nomTube[size]; 

for(j = 0; j < childs; j++) 
{ 
sprintf(nomTube, "assistant%d.fifo", j); 
if(mkfifo(nomTube, 0777) != 0) 
{ 
    fprintf(stderr, "Impossible de créer le tube nommé.\n"); 
    //exit(EXIT_FAILURE); 
} 
} 

for(i = 0; i < childs; i++) 
{ 
if(fork() == 0) 
{ 
    pid = i; 
    if(pid % 2 == 0) 
     {Writing(pid); printf("Child(%d) writing done;\n", pid);} 
    else 
     {Reading(pid); printf("Child(%d) reading done;\n", pid);} 
    break; 
} 
} 

for(k = 0; k < childs; k++) 
{ 
wait(NULL); 
} 

return 0;} 

今ライティング機能:

void Writing(int pid){ 
int entreeTube; 
int var = pid; 
int i; 
if(pid == 0) 
{ 
for(i = 0; i < 2; i++) 
{ 
    printf("Child(%d) i'm writing to Child(%d) var = %d;\n", pid, 1, var); 
    if((entreeTube = open("assistant1.fifo", O_WRONLY)) == -1) 
    { 
     fprintf(stderr, "Impossible d'ouvrir l'entrée du tube nommé.\n"); 
     //exit(EXIT_FAILURE); 
    } 
    write(entreeTube, &var, sizeof(int)); 
} 
} 
else if(pid == 2) 
{ 
for(i = 0; i < 2; i++) 
{ 
    printf("Child(%d) i'm writing to Child(%d) var = %d;\n", pid, 3, var); 
    if((entreeTube = open("assistant3.fifo", O_WRONLY)) == -1) 
    { 
     fprintf(stderr, "Impossible d'ouvrir l'entrée du tube nommé.\n"); 
     //exit(EXIT_FAILURE); 
    } 
    write(entreeTube, &var, sizeof(int)); 
} 
}} 

今読ん機能:だから、基本的に

void Reading(int pid){ 
int sortieTube; 
int var = -1; 
int i; 

if(pid == 1) 
{ 
for(i = 0; i < 2; i++) 
{ 
    if((sortieTube = open ("assistant1.fifo", O_RDONLY)) == -1) 
    { 
     fprintf(stderr, "Impossible d'ouvrir la sortie du tube nommé.\n"); 
     //exit(EXIT_FAILURE); 
    } 

    read(sortieTube, &var, sizeof(int)); 
    printf("Child(%d) var = %d\n", pid, var); 
} 
} 
else if(pid == 3) 
{ 
for(i = 0; i < 2; i++) 
{ 
    if((sortieTube = open ("assistant3.fifo", O_RDONLY)) == -1) 
    { 
     fprintf(stderr, "Impossible d'ouvrir la sortie du tube nommé.\n"); 
     //exit(EXIT_FAILURE); 
    } 

    read(sortieTube, &var, sizeof(int)); 
    printf("Child(%d) var = %d\n", pid, var); 
} 
}} 

  • 子ども(0)は「assistant1.fifo」に2回書き込みます。書き込み0
  • 子供(2)は "assistant3.fifo"に2回書き込みます|書き込み2
  • 子供(1)は "assistant1.fifo"を2回読み込みます。 0を読み取ります
  • 子供(3)は "assistant3.fifo"を2回読み取ります。読み込み2

時には動作しますが、時にはブロックするだけです。それをブロックするためには、何度か実行しなければならないかもしれません。

これは同期の問題ですか?書き込み/読み取りはブロックされていますが?

私は問題がどこにあるか分かりません。だから私はパイプの仕組みに関連するものがないと思います。あなたは何が間違っているのを見ますか?

私はコード編集とインデントについて謝罪しました。私の英語についても、十分理解していただければ幸いです。

答えて

0

私はawnserを見つけたと信じています。 私は、書き込みと読み取りの両方でmkfifoを一度だけ開いて問題を解決しました。その後、書き込みまたは読み取りを行うループが発生します。

printf("Child(%d) i'm writing to Child(%d) var = %d;\n", pid, 1, var); 
    if((entreeTube = open("assistant1.fifo", O_WRONLY)) == -1) 
    { 
     fprintf(stderr, "Impossible d'ouvrir l'entrée du tube nommé.\n"); 
     //exit(EXIT_FAILURE); 
    } 
    for(i = 0; i < 2; i++) 
    { 
     write(entreeTube, &var, sizeof(int)); 
    } 

読み取りプロセスと同じことです。 誰もがこの背後にある力学を知っていて、それを説明できるならば、それはうまくいきますが、私は感謝します。 ありがとうございました:)

関連する問題