C:线程之间的Fifo,写入和读取字符串

时间:2010-06-08 11:21:24

标签: c pipe pthreads

你好,亲爱的互联网,

我正在编写一个小程序,除其他外,它会将收到的所有命令写入日志文件 为此,我想使用一个只会尝试从管道读取的线程,而主线程将在任何时候写入该管道。

由于我不知道每个字符串命令的长度,我考虑过编写和读取指向char buf[MAX_MESSAGE_LEN]的指针。
既然我到目前为止所做的尝试都不起作用,我会尽力而为:P

   char str[] = "hello log thread 123456789 10 11 12 13 14 15 16 17 18 19\n";  
    if (pipe(pipe_fd) != 0) 
        return -1;  
    pthread_t log_thread;  
    pthread_create(&log_thread,NULL, log_thread_start, argv[2]);  
    success_write = 0;  
    do {  
        write(pipe_fd[1],(void*)&str,sizeof(char*));  
    } while (success_write < sizeof(char*));

并且线程执行此操作:

    char buffer[MAX_MSGLEN];  
    int success_read;  
    success_read = 0;  
    //while(1) {  
        do {  
            success_read += read(pipe_fd[0],(void*)&buffer, sizeof(char*));  
        } while (success_read < sizeof(char*));  
    //}  
    printf("%s",buffer); 

(对不起,如果这不缩进,我似乎无法弄清楚这个编辑器......) 哦,pipe_fd[2]是一个全局参数。

所以,无论是通过我想到的方式,还是以其他方式阅读字符串而不知道长度的任何帮助,都会非常感激。

另外,我正在研究Eclipse IDE C / C ++版本1.2.1,我似乎无法设置编译器,因此它会将pthread库链接到我的项目。我已经使用自己的Makefile编写它(双关语:P)的工作。任何人都知道如何解决链接问题?我在网上看过,但我找到的解决方案在旧版本上可能都不错,因为标签和选项键不同。

无论如何,感谢一堆互联网! Yonatan

6 个答案:

答案 0 :(得分:0)

为什么要按4个或8个字节的sizeof(char*)字节块读取和写入数据?您不必被相同的字节数读取和写入!

如果您的问题是您没有在阅读主题中收到数据,那么您应该考虑在写入后使用sync()进行同步。

答案 1 :(得分:0)

对我来说,如果你刚刚读了或写得太多,那么你的代码就会终止。你应该有,而success_read&lt; MAX_MSGLEN或sizeof(str)。

答案 2 :(得分:0)

你真的需要一个额外的线程吗?正如你所发现的那样,添加线程会增加很多复杂性......在这种情况下,写入管道可能不会比写入文件快得多 - 事实上,它可能最终在实践中变慢,因为write()没有fprintf()和朋友那样的缓冲。最好的解决方案可能就是直接写入日志文件......

答案 3 :(得分:0)

您是否尝试过socketpair(AF_UNIX,SOCK_DGRAM)?它本质上是可靠的,也会为你划分消息。

在您的情况下,您必须确保MAX_MESSAGE_LEN小于PIPE_BUF,即平台对pipe()内部缓冲区的限制。

显然,将指针发送/重新发送到发送实际字符串,例如:

-   char str[] = "hello log thread 123456789 10 11 12 13 14 15 16 17 18 19\n";
+   char str[MAX_MESSAGE_LEN] = "hello log thread 123456789 10 11 12 13 14 15 16 17 18 19\n";

- write(pipe_fd[1],(void*)&str,sizeof(char*));
+ write(pipe_fd[1],(void*)&str,MAX_MESSAGE_LEN);

答案 4 :(得分:0)

您没有在循环中更新success_write

答案 5 :(得分:0)

  

所以,无论是通过我想到的方式,还是以其他方式阅读字符串而不知道长度的任何帮助,都会非常感激。

您可以创建一个简单的协议来通过FIFO /管道进行通信。写入器线程将单个字节写入FIFO以指示消息长度,然后写入可变长度消息。读取器将读取单个字节以了解消息的长度,然后为指定的消息长度发出后续读取命令。

您可能需要在FIFO上查看此answer到类似question的详细信息。