2013-01-05 4 views
3

저는 월요일에 연구소가 나오기 전에 FIFO와이 낮은 레벨의 I/O에 대한 통찰력을 얻으려고 노력해 왔습니다.FIFO 파일 및 읽기/쓰기

프로그램을 수행해야합니다

서버 :

  • 5 메시지 전송, FIFO를를 만듭니다
  • 는 FIFO를을 삭제, 5 초 간격으로, "메시지 #I을"

클라이언트 :

  • 는 FIFO에서 읽고 메시지를 표시 6 초 동안 MSG가 없었다 경우
  • 종료,

을 그리고 그것은 그러나 통신 않으며, 클라이언트는 내가 그를 보낼하지 않았다 정확히 표시하고, 더 중요한 것은 새로운 메시지가 도착할 때마다 처음부터 읽는 것 같습니다. 나는 꽤 오랫동안 알아 내려고 노력해 왔으며 문서가 말한 것과 일치하지 않는 것 같습니다. 제발 도와주세요! :(

서버

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

int main(int argc, char* argv[]) 
{  
    int s2c, c2s, i; 
    char fifo_name1[] = "/tmp/fifo1"; 
    char fifo_name2[] = "/tmp/fifo2"; 
    char msg[80], buf[10]; 
    struct stat st; 

    // if no fifos, create 'em 
    if (stat(fifo_name1, &st) != 0) 
     mkfifo(fifo_name1, 0666); 
    if (stat(fifo_name2, &st) != 0) 
     mkfifo(fifo_name2, 0666); 

    s2c= open(fifo_name1, O_WRONLY); 
    c2s= open(fifo_name2, O_RDONLY); 

    // start sending messages, with 5s interval 
    for (i=0; i<5; i++) 
    { 
     printf("Message #%d \n", i); 

     strcat(msg, "Message #"); 
     strcat(msg, itoa(i, buf, 10)); 
     strcat(msg, "\0"); 

     write(s2c, msg, strlen(msg)+1); 

     sleep(5); 
    } 

    // delete fifos 
    unlink(fifo_name1); 
    unlink(fifo_name2); 
    printf("server exit successfully"); 
    return EXIT_SUCCESS; 
} 

클라이언트

#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char* argv[]) 
{ 
    int c2s, s2c, c=0; 
    char buf[10]; 

    char fifo_name1[] = "/tmp/fifo1"; 
    char fifo_name2[] = "/tmp/fifo2"; 
    s2c= open(fifo_name1, O_RDONLY); 
    c2s= open(fifo_name2, O_WRONLY); 

    // receive messages 
    while (1) 
    { 
     if (read(s2c, &buf, sizeof(char)*10) > 0) 
     { 
      printf("%s \n", buf); 
      c=0; 
     } 
     sleep(1); 
     c++;  
     if (c>6) 
      break; 
    } 

    printf("client exit successfully"); 
    return EXIT_SUCCESS; 
}  

답변

3

strcat(msg, "Message #"); 항상 이미 msg에 문자열의 끝에 추가하고, 문자열이 루프 동안 재설정되지 않습니다. 교체 strcpy(msg, "Message #");으로 각 새 메시지를 처음부터 시작하십시오.

+0

고마워, 그 지금 일하고있어! : D 나는 completly 틀린 장소에서 실수를 찾고 있었던 것처럼 보였다, 나에 대한 수치심 :( – Kreweta