C 定期读取使用dup2重定向到管道的标准输出内容时出现问题
我必须定期读取重定向到文件的标准输出的内容。请帮我解决这个问题 我的问题是,在第一个线程中有两个线程,我必须执行一个c文件 它不断地将输出写入标准输出(即在无限循环中写入hello world)和 在第二个线程中,我必须定期从标准输出中检索逐行输出,并将其存储在缓冲区中 下面是上述要求的代码:请建议我我的方法正确吗? 以及如何实现entryOpThread()方法,以便它定期读取标准输出的内容 是否应该使用read()系统调用、getLine()或任何其他方法逐行读取 管道(标准输出重定向到此管道)。 在本例中,exec线程正在执行test.c,它在stdout上连续打印hello world, 所以根据我的要求,我必须在管道的Outputthread中逐行连续地读取这个输出(“Hello world”),并将其存储在缓冲区中 //C 定期读取使用dup2重定向到管道的标准输出内容时出现问题,c,unix,C,Unix,我必须定期读取重定向到文件的标准输出的内容。请帮我解决这个问题 我的问题是,在第一个线程中有两个线程,我必须执行一个c文件 它不断地将输出写入标准输出(即在无限循环中写入hello world)和 在第二个线程中,我必须定期从标准输出中检索逐行输出,并将其存储在缓冲区中 下面是上述要求的代码:请建议我我的方法正确吗? 以及如何实现entryOpThread()方法,以便它定期读取标准输出的内容 是否应该使用read()系统调用、getLine()或任何其他方法逐行读取 管道(标准输出重定向到此管
#包括
#包括
#包括
#包括
const int MAX_LENGTH=100;
使用名称空间std;
//! 复制系统标准输入的文件描述符
int输入管道[2];
//! 复制系统标准输出的文件描述符
int输出管道[2];
//!线程来检索输出
//!
pthread_t OpThread;
//!执行脚本的线程
//!
pthread\u t ExecThread;
//! exec线程的入口点
void*entryExecThread(void*obj)
{
//创建子进程以启动脚本
int-lPid;
lPid=fork();
//将管道的读取端连接到标准输入
如果(dup2(输入管道[0],标准输入文件号)=-1)
{
//抛出异常
}
//将管道的写入端连接到标准输出
如果(dup2(输出管道[1],标准输出文件号)=-1)
{
//抛出异常
}
如果(lPid==0)
{
execvp(“./测试”,空);
}
其他的
{
int-mProcessId=lPid;
waitpid(mProcessId,NULL,0);
}
返回NULL;
}
//! 输出线程的入口点
void*entryOpThread(void*obj)
{
//定期读取标准输出的内容
char*lMssg=新字符[最大长度];
读取(输出管[0],lMssg,最大长度);
文件*fd=fdopen(输出管道[0],“r”);
int lBufferLength=最大长度;
/*while(true)
{
getline(&lMssg,(尺寸*)&lBufferLength,fd);
//将消息推送到输出缓冲区
如果(lMssg!=NULL)
{
pthread_mutex_lock(&mOutputBufferMutex);
mOutputBuffer.push(lMssg);
pthread_mutex_unlock(&mOutputBufferMutex);
}
}
*/
}
int main(){
//调用管道系统调用
如果(管道(输入管道)=-1)
{
printf(“打开文件时出错\n”);
}
如果(管道(输出管道)=-1)
{
printf(“打开文件时出错\n”);
}
//创建输出线程以检索输出
if(pthread_create(&OpThread,0,entryOpThread,NULL)!=0)
{
//抛出异常
printf(“为ID为的脚本创建输出线程失败\n”);
}
//创建执行线程以启动脚本
pthread\u t execThread;
if(pthread_create(&ExecThread,0,entryExecThread,NULL)!=0)
{
//停止输出线程
pthread_cancel(OpThread);
//抛出异常
printf(“为ID为的脚本创建执行线程失败\n”);
}
}
测试c
#include <stdio.h>
#include "string.h"
//using namespace std;
int main() {
int i=0;
while(i<500)
{
printf("!!!Hello World!!! \n" ); // prints !!!Hello World!!!
//extracting header and data from message
sleep(5);
i++;
}
return 0;
}
#包括
#包括“string.h”
//使用名称空间std;
int main(){
int i=0;
而(i发送到管道的数据被缓冲,因此您不需要另一个缓冲区。只要在需要时从管道读取数据即可。您可以使用函数测试是否有数据要读取。您不需要读取器线程
另外,您不需要exec线程,因为您无论如何都是fork
此外,应用程序几乎会立即终止,因为主线程将在触发次线程后终止
需要指出的另一点是,您应该关闭不需要的句柄。pipe
打开2个句柄,fork
复制所有打开的句柄,dup2
复制一个句柄。您没有关闭任何句柄
若您只想读取某个进程的输出,请使用下面的简短示例运行它
主应用程序:
int main()
{
FILE *f = popen("./test", "r"); // open the process
/* Your application is busy now, but the process runs and outputs */
sleep(5);
/* Now assume you need some data - just read it */
int c;
while (0 <= (c = fgetc(f))) putchar(c);
}
intmain()
{
FILE*f=popen(“./test”,“r”);//打开进程
/*您的应用程序现在正忙,但进程正在运行并输出*/
睡眠(5);
/*现在假设您需要一些数据-只需读取即可*/
INTC;
而(0)
int main()
{
FILE *f = popen("./test", "r"); // open the process
/* Your application is busy now, but the process runs and outputs */
sleep(5);
/* Now assume you need some data - just read it */
int c;
while (0 <= (c = fgetc(f))) putchar(c);
}
int main()
{
int i;
for (i = 0; i < 10; i++) {
puts("Hello world!");
fflush(stdout);
sleep(1);
}
}