你好,亲爱的互联网,
我正在编写一个小程序,除其他外,它会将收到的所有命令写入日志文件 为此,我想使用一个只会尝试从管道读取的线程,而主线程将在任何时候写入该管道。
由于我不知道每个字符串命令的长度,我考虑过编写和读取指向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 :(得分: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)