私は現在、名前付きパイプを通じて通信する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
時には動作しますが、時にはブロックするだけです。それをブロックするためには、何度か実行しなければならないかもしれません。
これは同期の問題ですか?書き込み/読み取りはブロックされていますが?
私は問題がどこにあるか分かりません。だから私はパイプの仕組みに関連するものがないと思います。あなたは何が間違っているのを見ますか?
私はコード編集とインデントについて謝罪しました。私の英語についても、十分理解していただければ幸いです。