현재 명명 된 파이프를 통해 통신하는 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
때때로 작동하지만 일부 다른 블록은 차단됩니다. 블록을 보지 못하게하려면 몇 번 실행해야 할 수도 있습니다.
동기화 문제입니까? 쓰기/읽기가 차단 되더라도?
나는 문제가 어디에 있는지를 보지 못한다. 그래서 파이프 메카닉과 관련이 없다. 무엇이 잘못되었는지 보시겠습니까?
코드 편집 및 들여 쓰기에 대한 사과와 제 영어에 대해서도 충분히 이해할 수 있기를 바랍니다.