2017-04-13 14 views
0

선택적 클래스 할당을 위해 서버 프로세스와 클라이언트 프로세스를 만들고 서로 통신하도록하려고합니다.write for open write "해당 장치 또는 주소가 없음"

1) 우리는 소켓

을 사용할 수 없습니다) 우리는

3을 쓰기 위해 2 FIFO를, 읽기 전용으로 하나 하나를 작성해야합니다)

2 O_NONBLOCK

을 사용해야합니다 교수는라고 우리에게 이야기

그래서 서버 프로세스에 2 개의 FIFO를 만들었고 열려고 시도했지만 WRONLY에 대한 열기는 "해당 장치 또는 주소 없음"을 반환했습니다.

서버 프로세스 :

...... 

if(mkfifo("fifo1", PERMS) < 0 && errno != EEXIST) 
{ 
    perror("can't create FIFO (read)"); 
    exit(EXIT_FAILURE); 
} 
if(mkfifo("fifo2", PERMS) < 0 && errno != EEXIST) 
{ 
    perror("can't create FIFO (write)"); 
    exit(EXIT_FAILURE); 
} 

if((readfd = open("fifo1", O_RDONLY | O_NONBLOCK)) < 0) 
{ 
    perror("console: can't open read FIFO"); 
    exit(EXIT_FAILURE); 
} 
if((writefd = open("fifo2", O_WRONLY | O_NONBLOCK)) < 0) 
{ 
    perror("coord: can't open write FIFO"); 
    exit(EXIT_FAILURE); 
} 

클라이언트 프로세스 : 나는 온라인 솔루션을 보면서 내가 무엇이 잘못되었는지 잘 설명 this 대답을 발견하지만, 아무튼

..... 

if((readfd = open("fifo2", O_RDONLY | O_NONBLOCK)) < 0) 
{ 
    perror("console: can't open read FIFO"); 
    exit(EXIT_FAILURE); 
} 
if((writefd = open("fifo1", O_WRONLY | O_NONBLOCK)) < 0) 
{ 
    perror("console: can't open write FIFO"); 
    exit(EXIT_FAILURE); 
} 

while(fgets(buffer, 100, stdin)) //char buffer[100]; 
{ 
    n = strlen(buffer); 
    w = write(writefd, buffer, n); 

    memset(buffer, 0, 100); 
} 

문제를 해결할 방법을 제안하지 않습니다. 다시 온라인으로 보았는데 select()으로 나타났습니다. 솔루션을 제공 할 수있는 것처럼 보였지만 정확히 작동하는지 이해하는 데 어려움이있었습니다.

select()을 사용하면이 문제를 해결할 수 있습니까?

답변

0

FIFO가 이미 열려 있지 않으면 FIFO를 블로킹없이 쓰기 위해 열 수 없습니다. 가장 간단한 해결 방법은 초를 기다린 후 open을 반복하여 ENXIO을 반환하는 것입니다. 다른 쪽이 돌아갈 때까지 반복하십시오.

writefd = open(fifo_name, O_WRONLY); 
    fcntl(writefd, F_SETFL, O_NONBLOCK); 

PS : 나는 강하게에 추천

+0

그래서 while (1) 또는 for (;;) 루프를 작성하기 위해 open for write를 사용하여 간단한 루프를 제안합니다. 처음에는 한 번만 발생하기 때문에 좋은 해결 방법이라고 생각합니다. 감사합니다 –

+0

@FotisSk 예. 이론적 근거를 설명하는 주석과 왜 더 많은 노력을 기울일 가치가 없는지에 대한 설명을 추가하십시오. –

+0

예, 할 것입니다. 그건 그렇고, 뭔가 나에게 다가왔다. 읽기 (또는 다른 임의의 명령)가 -1을 반환하면 무시하고 다시 읽으려면 "확인"됩니까? 도와 주셔서 미리 감사드립니다 !! –

1

직접적인 해결책은 (그것이 다른 쪽 끝을 읽기 위해 열릴 때까지 차단됩니다), 그리고 나중에 비 블로킹하게 차단 모드에서 쓰기 위해 open FIFO이다 바쁜 대기.

+0

매우 우아한 솔루션입니다. 감사! –