2016-12-22 13 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)); 
    } 

독서 과정과 동일합니다. 비록 그것이 잘 작동하고 있지만 누군가가이 모든 것의 배후에있는 기계공을 알고 있고 그것들을 설명 할 수 있다면 나는 감사 할 것입니다. 대단히 감사합니다.