Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 定期读取使用dup2重定向到管道的标准输出内容时出现问题_C_Unix - Fatal编程技术网

C 定期读取使用dup2重定向到管道的标准输出内容时出现问题

C 定期读取使用dup2重定向到管道的标准输出内容时出现问题,c,unix,C,Unix,我必须定期读取重定向到文件的标准输出的内容。请帮我解决这个问题 我的问题是,在第一个线程中有两个线程,我必须执行一个c文件 它不断地将输出写入标准输出(即在无限循环中写入hello world)和 在第二个线程中,我必须定期从标准输出中检索逐行输出,并将其存储在缓冲区中 下面是上述要求的代码:请建议我我的方法正确吗? 以及如何实现entryOpThread()方法,以便它定期读取标准输出的内容 是否应该使用read()系统调用、getLine()或任何其他方法逐行读取 管道(标准输出重定向到此管

我必须定期读取重定向到文件的标准输出的内容。请帮我解决这个问题

我的问题是,在第一个线程中有两个线程,我必须执行一个c文件 它不断地将输出写入标准输出(即在无限循环中写入hello world)和 在第二个线程中,我必须定期从标准输出中检索逐行输出,并将其存储在缓冲区中

下面是上述要求的代码:请建议我我的方法正确吗? 以及如何实现entryOpThread()方法,以便它定期读取标准输出的内容 是否应该使用read()系统调用、getLine()或任何其他方法逐行读取 管道(标准输出重定向到此管道)。 在本例中,exec线程正在执行test.c,它在stdout上连续打印hello world, 所以根据我的要求,我必须在管道的Outputthread中逐行连续地读取这个输出(“Hello world”),并将其存储在缓冲区中 //

#包括
#包括
#包括
#包括
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);
    }
}