2010-06-08 121 views
2

喂一次亲爱的互联网之间,C:先进先出线程,写入和读取字符串

我写一个小程序,除其他事项外,写入日志文件中的所有收到的命令。
为此,我想使用一个只会尝试从管道中读取的线程,而主线程只要它应该写入该管道。

由于我不知道每个字符串命令的长度,所以我想到了写入和读取指向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

+0

修正了您的缩进问题,使用代码按钮的同时突出显示较大的代码块。 ''语法是用于内联代码的。 – Femaref 2010-06-08 11:23:53

回答

0

你为什么要读写数据的是大小为sizeof(char*)的字节,即4或8字节?您不会被强制读取和写入相同数量的字节!

如果您的问题是您没有在读取线程中收到数据,则应该在写入后使用sync()考虑同步。

+0

不,fflush()用于刷新stdio缓冲区。他直接使用read()和write(),它绕过了stdio。 – psmears 2010-06-08 11:57:05

0

对我来说,如果你碰巧读或写了太多内容,那么你的代码就会终止。你应该有,而成功读取< MAX_MSGLEN或sizeof(str)。

0

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

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); 
0

您没有更新循环中的success_write

0

因此,任何帮助,无论是我想到的方式,或另一种方式,我可以阅读字符串不知道长度,将不胜感激。

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

你可能想看看这个answer到FIFO的类似question更多的细节。