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

本文配套程序下载地址为: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


 


  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
进程和线程是操作系统中实现并发执行的两种方式。进程是资源分配的最小单位,而线程是CPU调度的最小单位。 进程是指正在执行中的程序的实例。每个进程都有独立的地址空间和系统资源,包括文件描述符、处理器状态、堆栈和据段等。进程间的通信可以通过共享内存、信号量、消息队列等方式实现。 C语言中通过调用系统调用函来创建和管理进程。例如,使用fork()函可以创建一个新的子进程,fork()函会返回两次,一次在进程中返回子进程的PID,一次在子进程中返回0。通过调用exec()函可以在当前进程中加载并执行一个新的程序。 线程是在一个进程内部运行的一系列指令,共享进程的地址空间和资源。多个线程之间可以并发执行,并且共享进程的资源,包括全局变量、文件描述符等。线程之间的通信可以通过共享变量、互斥锁、条件变量等方式实现。 C语言中可以通过调用pthread库函来创建和管理线程。例如,使用pthread_create()函可以创建一个新的线程,并指定线程的入口函。通过调用pthread_join()函可以等待一个线程的结束,并且在主线程中获取线程的返回值。 总结来说,进程和线程都是实现并发执行的方式,但进程是独立的执行实体,而线程共享进程的资源。通过C语言中的系统调用函和pthread库函可以方便地创建和管理进程与线程。进程和线程的选择要根据实际情况,考虑到并发执行的需求、性能要求和资源利用等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值