这是我的代码架构(为简单起见,删除了错误控制)
主要的:
freopen("error.txt","w",stderr);//redirecting stderr to error.txt
FILE *fp=popen("./process", "w");//lunching a process
pthread_t readerThread;
/*reading output from process lunched in a thread otherwise it could block*/
pthread_create(&readerThread, NULL,IsKhacToolKit::threadRead, solver);
solver->generateDimacFile(fp);
pclose(fp);
pthread_exit(0);
对象求解器使用
fprintf(stderr,"Somes debugs Messages" --------%f seconds |%f seconds\n", (double)(start-tmp)/CLOCKS_PER_SEC, (double)start/CLOCKS_PER_SEC);
到处追踪发生的事情。
我的问题是,当我午餐可执行文件时,我可以看到调试消息,但我不明白为什么,因为在做任何事情之前,我将 stderr 重定向到 error.txt。我在这里想念什么?
我正在尝试做的是启动一个进程,给他输出威胁,然后我需要读取它的输出。但显然我不明白它是如何工作的,因为在这里我已经无法理解为什么调试消息会打印到控制台中。
在计算线程函数中进程的输出之后,我也使用 fclose(stderr)。
//编辑示例:
_______@voisin:~/espaces/travail/calculabilite/version2$ ./dimac_generator_is_k_HAC 10K2 5
Initializing adjList --------0.003381 seconds |0.003381 seconds
Initialiszing translater --------0.000125 seconds |0.003506 seconds
Allocating solutionParser --------0.000012 seconds |0.003518 seconds
s UNSATISFIABLE
^C
_______@voisin:~/espaces/travail/calculabilite/version2$ cat error.txt
Preparing buffer to receive dimacFile --------0.000627 seconds |0.004145 seconds
Tranlating contraint 1 --------0.000451 seconds |0.004596 seconds
Tranlating contraint 2 --------0.000045 seconds |0.004641 seconds
Tranlating contraint 3 --------0.000010 seconds |0.004651 seconds
Tranlating contraint 4 --------0.000037 seconds |0.004688 seconds
Sending dimacFile to glucose --------0.000029 seconds |0.004717 seconds
_______@voisin:~/espaces/travail/calculabilite/version2$
整个事情还没有完成,所以它阻塞了。我需要Ctrl+C但您可以看到Ctrl+之前C的调试消息已被打印。打印后添加 fflush 允许 error.txt 不再为空。