`
haierboos
  • 浏览: 438330 次
文章分类
社区版块
存档分类
最新评论

进程通信之三 父进程传参数与子进程返回值

 
阅读更多

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5165733

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8646902

欢迎关注微博:http://weibo.com/MoreWindows

前面已经写了使用WM_COPYDATA消息来完成进程之间的通信

1.《进程通信之一使用WM_COPYDATA C++C#实现

http://blog.csdn.net/morewindows/article/details/6804157

然后用了三篇文章来讲解如何使用管道技术来完成进程通信功能。

1.《进程通信之二管道技术第一篇输入输出的重定向

http://blog.csdn.net/morewindows/article/details/7390350

2.《进程通信之二管道技术第二篇匿名管道

http://blog.csdn.net/morewindows/article/details/7390441

3.《进程通信之二管道技术第三篇命名管道

http://blog.csdn.net/morewindows/article/details/8260087

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

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

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

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

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

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

//进程通信之三 父进程传参数与子进程返回值
//http://blog.csdn.net/morewindows/article/details/8683830
//By MoreWindows( http://blog.csdn.net/MoreWindows )
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
// 启动子进程并传入参数,等待子进程结束后获取其返回值。
BOOL GetChildProcessExitCode(const char *pstrChildProcessExeFileName, 
							 char *pstrConmandLine, 
							 DWORD *pdwExitCode, BOOL fHide = TRUE)
{
	//子进程启动信息设置
    STARTUPINFO si;  
    si.cb = sizeof(STARTUPINFO);  
    GetStartupInfo(&si);    
    si.wShowWindow = fHide ? SW_HIDE : SW_SHOW;
    si.dwFlags     = STARTF_USESHOWWINDOW;  

	// 运行子进程并等待其结束
	PROCESS_INFORMATION pi;   
	CreateProcess(pstrChildProcessExeFileName, pstrConmandLine, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);  
	WaitForSingleObject(pi.hProcess, INFINITE);  
	
	// 获取子进程返回值
	BOOL flag = GetExitCodeProcess(pi.hProcess, pdwExitCode);

	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);

	return flag;
}

int main()
{
	printf("    进程通信之三 父进程传参数与子进程返回值\n");        
	printf(" - http://blog.csdn.net/morewindows/article/details/8683830 -\n");
	printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");  

	AdjustProcessCurrentDirectory();
	
	const char *pstrChildProcessExeFileName = "ChildProcess.exe";
	const int RUN_CHILDPROCESS_NUMBER = 5;
	char szCommandLine[30] = "MoreWindows";
	int nCommandLineLen = strlen(szCommandLine);
	for (int i = 0; i < RUN_CHILDPROCESS_NUMBER; i++)
    {
		// 运行子进程并获取返回值
		DWORD dwExitCode;
		if (GetChildProcessExitCode(pstrChildProcessExeFileName, szCommandLine, &dwExitCode, TRUE))
			printf("子进程返回值为 %d\n", dwExitCode - nCommandLineLen);
		else
			printf("GetExitCodeProcess()失败  %d\n", GetLastError());

		Sleep(1000);
	}
	getch();
	return 0;
}

程序运行结果如下:

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5165733

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8646902

欢迎关注微博:http://weibo.com/MoreWindows



分享到:
评论

相关推荐

    操作系统上机实验报告-进程的管道通信

    2) wait() 常用来控制父进程与子进程的同步。 在父进程中调用wait(),则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,父进程从wait()返回继续执行原来的程序。 返回值:大于0时,为子进程的ID值;...

    进程通信.doc

    子进程写入和父进程读的命名管道:图见附件 管道读写注意事项: 可以通过打开两个管道来创建一个双向的管道。但需要在子理程中正确地设置文件描述符。必须在系统调用fork()中调用pipe(),否则子进程将不会继承...

    操作系统课程实验.rar

    由父进程创建一个管道,然后再创建 3 个子进程,并由这三个子进程利用管道与父进程 之间进行通信:子进程发送信息,父进程等三个子进程全部发完消息后再接收信息。通信的 具体内容可根据自己的需要随意设计,要求能...

    [详细完整版]操作系统三.pdf

    操作系统实验(三) 一、实验名称:进程的同步、互斥、撤消 二、实验目的 1 理解进程的同步、互斥、撤消等控制方法 2 熟悉进程间通过软中断传递控制信息的方法(低级通信) 三、实验内容 并发进程间通过软中断传递控制...

    易语言 茶凉专用模块

    子程序 到任意进制, 文本型, 公开, 可以将从二进制到三十六进制的数值随意进行转换(返回转换后的文本) .参数 被转换文本, 文本型, , 欲被转换的文本(不可以转换负数以及小数) .参数 被转换进制, 整数型, , 被转换...

    python多线程DAY01.txt

    前情回顾 1.epoll模型 : 效率高 , 触发方式更多 2.本地套接字 AF_UNIX 本地两个进程间的... 功能 :在父进程中阻塞等待处理子进程退出 返回值: pid 退出的子进程的PID号 status 获取子进程退出状态 pid,sta

    双一流大学《操作系统》课程报告

    编制一段程序,使用系统调用 fork()创建两个子进程,再用系统调用 signal()让父进程捕捉键盘上来的中断信号(即按 ctrl+c 键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号...

    linux系统编程之线程.zip

    start_routine返回时,这个线程就退出了,其它线程可以调用pthread_join得到start_routine的返回值,类似于父进程调用wait(2)得到子进程的退出状态,稍后详细介绍pthread_join。 pthread_create成功返回后,新创建的...

    Node.js中创建和管理外部进程详解

    在Node里,子进程可以和父进程进行双向通信,而且在某种程度上,父进程还可以监控和管理子进程。 另外一种需要使用子进程的情况是,当你想简单地执行一个外部命令,并让Node获取命令的返回值时。比如,你可以执行一...

    linux内核 0.11版本源码 带中文注释

    #include &lt;linux/tty.h&gt; // tty 头文件,定义了有关tty_io,串行通信方面的参数、常数。 #include &lt;linux/sched.h&gt; // 调度程序头文件,定义了任务结构task_struct、第1 个初始任务 // 的数据。还有一些以宏的形式...

    Linux系统中C语言编程创建函数fork()执行解析

     (pid_t 是一个宏定义,其实质是int 被定义在#include中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1  (3)函数说明  一个现有进程可以调用fork函数创建一个新...

    Unix编程常见问题解答 高清PDF含书签目录

    为何父进程死时,我的进程未得到SIGHUP信号? 1.16 How can I kill all descendents of a process? 我怎样杀死一个进程的所有派生进程? 2. General File handling (including pipes and sockets) 一般文件操作...

    frame-bridge

    该模块简化了另一个域上的父页面和嵌入页面(即 iframe 内的页面)之间的通信。 通过在引擎盖下使用 post message api,FrameBridge 使您可以在两侧(网页和 iframe 页面)定义一个 api 并将其公开给另一侧,从而在...

    java 面试题 总结

    如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的...

    超级有影响力霸气的Java面试题大全文档

    如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的...

    JAVA面试题最全集

    application或者applet中与servlet/jsp通信可以采用的方式。 31.简述逻辑操作(如&,|)与条件操作(如&&,||)的区别。 32.简述 Java Server Page 和 Servlet 的联系和区别。 33.简述synchronized和java.util....

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

Global site tag (gtag.js) - Google Analytics