博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重定位本进程的标准输出(非子进程)
阅读量:7007 次
发布时间:2019-06-27

本文共 3511 字,大约阅读时间需要 11 分钟。

PS:标准输入/标准错误 ,参考这个来弄吧。

 

环境:Win7(32位/64位),VC6

 

1、

1 int main() 2 { 3     printf("*stdin : %x\n", *stdin); 4     printf("*stdout : %x\n", *stdout); 5     printf("*stderr : %x\n", *stderr); 6  7     printf("stdin : %x\n", stdin); 8     printf("stdout : %x\n", stdout); 9     printf("stderr : %x\n", stderr);10 11     printf("GetStdHandle(STD_INPUT_HANDLE) return : %x\n", GetStdHandle(STD_INPUT_HANDLE));12     printf("GetStdHandle(STD_OUTPUT_HANDLE) return : %x\n", GetStdHandle(STD_OUTPUT_HANDLE));13     printf("GetStdHandle(STD_ERROR_HANDLE) return : %x\n", GetStdHandle(STD_ERROR_HANDLE));14 15     return 0;16 }

 

 

 

得到的结果为:

*stdin : 429620*stdout : 0*stderr : 0stdin : 425a30stdout : 425a50stderr : 425a70GetStdHandle(STD_INPUT_HANDLE) return : 3GetStdHandle(STD_OUTPUT_HANDLE) return : 7GetStdHandle(STD_ERROR_HANDLE) return : b

 

2、

中 五楼说到:

SetStdHandle 仅仅是对 Peb->ProcessParameters里的 StandardInput 、StandardOutput 、StandardError 3个变量的赋值而已。

printf内部实现类似于
  sprintf(buf,format,arglist)
  fwrite(stdout,buf);
其中stdout为CRT内部变量,在初始化时已经被设置为 stdout=GetStdHandle(STD_OUTPUT_HANDLE);
(具体看CRT代码,ioinit()),所以,即使你在程序里改变了Peb->ProcessParameters里的 StandardOutput ,stdout没有变化
想重定向PRINTF之类标准库函数,想办法改变stdout吧

2.1、

我看了 _ioinit() 里面条用了 宏stdhndl,确实 在_ioinit()中,有 “GetStdHandle(STD_INPUT_HANDLE);”、“GetStdHandle(STD_OUTPUT_HANDLE);”、“GetStdHandle(STD_ERROR_HANDLE);”,但是 是如何 赋值给 stdin、stdout、stderr 的  这个没看出来...

 

2.2、

printf 

 

2.3、

关于上面说到的 “Peb->ProcessParameters里的 StandardInput 、StandardOutput 、StandardError”,可以使用 WinDBG查看相关结构中的相关属性值,但是暂时还未自己亲手查看验证过...

 

 3、

 

 

 

PS:测试代码:

1 #include 
2 #include
3 4 #include
5 #include
6 7 int main() 8 { 9 printf("*stdin : %x\n", *stdin);10 printf("*stdout : %x\n", *stdout);11 printf("*stderr : %x\n", *stderr);12 printf("\n");13 14 printf("GetStdHandle(STD_INPUT_HANDLE) return : %x\n", GetStdHandle(STD_INPUT_HANDLE));15 printf("GetStdHandle(STD_OUTPUT_HANDLE) return : %x\n", GetStdHandle(STD_OUTPUT_HANDLE));16 printf("GetStdHandle(STD_ERROR_HANDLE) return : %x\n", GetStdHandle(STD_ERROR_HANDLE));17 printf("\n");18 19 STARTUPINFO si = {
0};20 si.cb = sizeof(STARTUPINFO);21 22 GetStartupInfo(&si);23 printf("si.hStdOutput(1) : %x\n", si.hStdOutput);24 25 SetStdHandle(STD_OUTPUT_HANDLE, (void*)100);26 27 GetStartupInfo(&si);28 printf("si.hStdOutput(2) : %x\n", si.hStdOutput);29 30 31 printf("\n");32 33 printf("*stdin : %x\n", *stdin);34 printf("*stdout : %x\n", *stdout);35 printf("*stderr : %x\n", *stderr);36 printf("\n");37 38 printf("GetStdHandle(STD_INPUT_HANDLE) return : %x\n", GetStdHandle(STD_INPUT_HANDLE));39 printf("GetStdHandle(STD_OUTPUT_HANDLE) return : %x\n", GetStdHandle(STD_OUTPUT_HANDLE));40 printf("GetStdHandle(STD_ERROR_HANDLE) return : %x\n", GetStdHandle(STD_ERROR_HANDLE));41 42 return 0;43 }

控制台输出:

1 *stdin : 4285e0 2 *stdout : 0 3 *stderr : 0 4  5 GetStdHandle(STD_INPUT_HANDLE) return : 3 6 GetStdHandle(STD_OUTPUT_HANDLE) return : 7 7 GetStdHandle(STD_ERROR_HANDLE) return : b 8  9 si.hStdOutput(1) : ffffffff10 si.hStdOutput(2) : ffffffff11 12 *stdin : 4285e013 *stdout : 0  // ZC: 这个值不改变的话,本进程的 标准输出流 是没有被重定向的。14 *stderr : 015 16 GetStdHandle(STD_INPUT_HANDLE) return : 317 GetStdHandle(STD_OUTPUT_HANDLE) return : 64  // ZC: 只有这个值 改变了18 GetStdHandle(STD_ERROR_HANDLE) return : b19 Press any key to continue

 

 

 

 

A

 

转载于:https://www.cnblogs.com/CodeSkill/p/4949325.html

你可能感兴趣的文章