2013-01-05 181 views
3

我一直试图在我的实验室周一前得到一些关于FIFO和这个低级I/O的见解,而我遇到了这种情况,我不太明白。FIFO文件和读取/写入

方案应:

服务器:

  • 创建的FIFO,
  • 发送5个消息: “消息#i”,用5秒的间隔,
  • 删除的FIFO,

客户端:

  • 从FIFO读取并显示消息,
  • 结束,如果有6秒无味精,

而且然而它确实沟通,客户端显示不正是我没有送他,更重要的是,每次新消息到达时,似乎都是从头开始阅读。我一直试图弄清楚,相当长一段时间,它似乎不符合文档所说的...请帮助! :(

服务器

#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看起来像我在一个完全错误的地方寻找错误,在我身上感到羞耻:( – Kreweta