zoukankan      html  css  js  c++  java
  • 进程间通信三:父进程传参数与子进程返回值

    转载自:http://blog.csdn.net/morewindows/article/details/8683830

    本篇介绍一个简单而又实用的进程通信方式——父进程向子进程传入参数并获取子进程返回值。这个非常简单:

    1.父进程向子进程传入参数可以由CreateProcess()函数来完成,注意子进程是通过GetCommandLine()来获取这个参数而且不是char *argv[]

    2.父进程要获取子进程的返回值可以在等待子进程结束后通过GetExitCodeProcess并传入子进程句柄来获取子进程中mainWinMain函数的返回值。

    下面就结出实例代码,首先来看子进程的程序代码:

    1. //进程通信之三 父进程传参数与子进程返回值  
    2. //http://blog.csdn.net/morewindows/article/details/8683830  
    3. //By MoreWindows( http://blog.csdn.net/MoreWindows )  
    4. #include <windows.h>  
    5. #include <stdio.h>  
    6. #include <stdlib.h>  
    7. #include <time.h>  
    8. #include <string.h>  
    9. int main(int argc, char *argv[])  
    10. {  
    11.     // 通过GetCommandLine()获取父进程通过CreateProcess传给子进程的参数  
    12.     // 注意这与argv[]不同如strlen(argv[1])会出错  
    13.     srand((unsigned int)time(NULL));  
    14.     return strlen(GetCommandLine()) + rand() % 10;  
    15. }  

    然后是父进程的程序代码,代码中的AdjustProcessCurrentDirectory();函数可以参考《Windows VC++ 调整进程当前目录为程序可执行文件所在目录》(http://blog.csdn.net/morewindows/article/details/8683519):

    1. //进程通信之三 父进程传参数与子进程返回值  
    2. //http://blog.csdn.net/morewindows/article/details/8683830  
    3. //By MoreWindows( http://blog.csdn.net/MoreWindows )  
    4. #include <windows.h>  
    5. #include <stdio.h>  
    6. #include <string.h>  
    7. #include <conio.h>  
    8. // 启动子进程并传入参数,等待子进程结束后获取其返回值。  
    9. BOOL GetChildProcessExitCode(const char *pstrChildProcessExeFileName,   
    10.                              char *pstrConmandLine,   
    11.                              DWORD *pdwExitCode, BOOL fHide = TRUE)  
    12. {  
    13.     //子进程启动信息设置  
    14.     STARTUPINFO si;    
    15.     si.cb = sizeof(STARTUPINFO);    
    16.     GetStartupInfo(&si);      
    17.     si.wShowWindow = fHide ? SW_HIDE : SW_SHOW;  
    18.     si.dwFlags     = STARTF_USESHOWWINDOW;    
    19.   
    20.     // 运行子进程并等待其结束  
    21.     PROCESS_INFORMATION pi;     
    22.     CreateProcess(pstrChildProcessExeFileName, pstrConmandLine, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);    
    23.     WaitForSingleObject(pi.hProcess, INFINITE);    
    24.       
    25.     // 获取子进程返回值  
    26.     BOOL flag = GetExitCodeProcess(pi.hProcess, pdwExitCode);  
    27.   
    28.     CloseHandle(pi.hProcess);  
    29.     CloseHandle(pi.hThread);  
    30.   
    31.     return flag;  
    32. }  
    33.   
    34. int main()  
    35. {  
    36.     printf("    进程通信之三 父进程传参数与子进程返回值 ");          
    37.     printf(" - http://blog.csdn.net/morewindows/article/details/8683830 - ");  
    38.     printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) -- ");    
    39.   
    40.     AdjustProcessCurrentDirectory();  
    41.       
    42.     const char *pstrChildProcessExeFileName = "ChildProcess.exe";  
    43.     const int RUN_CHILDPROCESS_NUMBER = 5;  
    44.     char szCommandLine[30] = "MoreWindows";  
    45.     int nCommandLineLen = strlen(szCommandLine);  
    46.     for (int i = 0; i < RUN_CHILDPROCESS_NUMBER; i++)  
    47.     {  
    48.         // 运行子进程并获取返回值  
    49.         DWORD dwExitCode;  
    50.         if (GetChildProcessExitCode(pstrChildProcessExeFileName, szCommandLine, &dwExitCode, TRUE))  
    51.             printf("子进程返回值为 %d ", dwExitCode - nCommandLineLen);  
    52.         else  
    53.             printf("GetExitCodeProcess()失败  %d ", GetLastError());  
    54.   
    55.         Sleep(1000);  
    56.     }  
    57.     getch();  
    58.     return 0;  
    59. }  

    程序运行结果如下:

     

  • 相关阅读:
    P2161 [SHOI2009]会场预约
    struts jar包
    struts
    HTML 简述
    JSP入门 分页
    JSP入门 生命周期
    JSP入门 el表达式
    JSP入门 导出文件
    JSP入门 文件上传
    自动增量字段重新从1开始的方法
  • 原文地址:https://www.cnblogs.com/wang-can/p/3331132.html
Copyright © 2011-2022 走看看