线程不刷新数据,无法从标准输入获取所有数据
Thread dont flush data, cannot get all the data from stdin
我正在创建一个套接字程序将数据从一台PC传输到另一台PC,但是当我发送一些二进制数据以处理到另一端时,我遇到了问题。在这种情况下,我需要一线程来侦听消息套接字,而数据套接字发送数据。所以我发现问题不在于套接字,如果我尝试将数据写入屏幕(这次没有套接字(,就会出现问题。所以我尝试使用 fflush(stdout( 刷新数据,但没有运气。代码以这种方式工作。
Initialize the 2 sockets.
Initialize 2 threads.
One to get the data back through the data socket.
The other send the data.
And while sending all the data one pthread_join(m_thread2) in the main function, because the data can take 1 second to be processed or one hour so i keep the program alive this way.
我使用两个线程创建了一个较小的版本来读取并发送到屏幕,并且主要只是一会儿。
法典:
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
const int RCVBUFSIZE=2000;
char echoString[RCVBUFSIZE];
int recvMsgSize;
static void * _sendExec(void *instance);
static void * _recvExec(void *instance);
int main(){
pthread_t m_thread, m_thread2;
int merror, merror2;
merror=pthread_create(&m_thread, NULL, _sendExec, NULL);
merror2=pthread_create(&m_thread2, NULL, _recvExec, NULL);
pthread_join(m_thread2, NULL);
}
static void * _sendExec(void *instance){
int size;
for(;;){
while((size=read(fileno(stdin), echoString, RCVBUFSIZE))>0){
write(fileno(stdout), echoString, size);
}
fflush(stdin);
fflush(stdout);
pthread_exit(0);
}
}
static void * _recvExec(void *instance){
while(1){
//recvMsgSize=msgTmp->recv(buffer, RCVBUFSIZE)
write(fileno(stdout), "", 0);
sleep(1);
}
}
如果您尝试cat file.tar.gz | ./a.out | tar -zvt
,您可以看到并非所有数据都显示在屏幕上,如果我戴上主,请删除pthread_join没关系,问题是我需要数据回来,这可能需要时间。就像我做cat file.tar.gz | ssh root@server "tar -zvt"
一样.问题是,在使用 recvExec 接收所有数据后,我只能杀死 sendExec,但它只是在之后将标准清刷新给我更改了代码并删除了套接字部分,只是为了说明问题
谢谢大家
在您的示例中,tar
正在等待更多输入,因为您从未提供文件结束指示。试试这个:
static void * _sendExec(void *instance){
int size;
for(;;){
while((size=read(fileno(stdin), echoString, RCVBUFSIZE))>0){
write(fileno(stdout), echoString, size);
}
fflush(stdin);
fflush(stdout);
fclose(stdout); // THIS IS THE LINE THAT FIXES THE SAMPLE PROGRAM
pthread_exit(0);
}
}
虽然添加fclose
修复您的示例程序,但我不一定建议在您的主程序中使用它。您的样本中仍然有一个无限循环(以_recvExec
为单位(,并且永远不会终止。
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 如何在 C++ 中获取中继器的委托数据?
- 从 Rcpp Catch 测试中获取有关"inst/extdata"的数据
- C++ - 忽略并从其他文件获取数据
- 如何获取C++字符数据类型的地址
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 很好的语法来获取对向量/数组数据的大小引用?
- 如何从网站获取数据并将其传输到数据库?
- 获取文件数据预处理器宏
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 如何在新的派生对象中获取基本对象的数据?
- 如何从 CSV 获取数据并将其存储在 C++ 中的表对象中
- 如何使用CAPL的诊断功能获取CAN传输的数据(256字节)?
- 获取 R 数据帧的内存地址
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- 从更改日志获取最新的 USN 数据
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 如何将控制台输出数据获取到命令提示符下
- 将零mq消息数据获取到std::vector<char>
- 从指定坐标[x, y]处的位图数据获取像素颜色