首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FIFO文件和读写

FIFO文件和读写
EN

Stack Overflow用户
提问于 2013-01-05 15:32:38
回答 1查看 31.5K关注 0票数 4

在周一的实验室之前,我一直试图了解FIFO和低水平I/O的一些情况,但我不太明白这种情况。

程序应该:

服务器:

  • 创建FIFO,
  • 发送5条消息:“消息#i",间隔5秒,
  • 删除FIFO,

客户端:

  • 从FIFO读取并显示消息,
  • 如果在6秒内没有味精,

然而,它确实与人交流,客户端显示的并不是我发送给他的内容,更重要的是,每次新的msg出现时,似乎都会从一开始就开始阅读。我一直想弄清楚,很长一段时间了,但似乎和文件上说的不一样……请帮帮忙!

服务器

代码语言:javascript
复制
#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;
}

客户端

代码语言:javascript
复制
#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;
}       
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-05 15:37:04

strcat(msg, "Message #");总是附加到msg中已经存在的字符串的末尾,并且在循环期间该字符串永远不会被重置。用strcpy(msg, "Message #");替换它,从零开始每条新消息。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14173268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档