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

实验三:进程通信(一) 实验三:进程通信(一) 1 .实验目的 学习如何利用管道机制、共享存储区机制进行进程间的通信,并加深对上述通信机制的理解。 进程间共享存储区通信机制的使用 使用共享内存机制实现一定长度的消息的发送和接收。 2 .实验内容 (1)了解系统调用pipe()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。 1.Pipe(): 系统调用格式:Pipe(Filedes)... 阅读详情

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

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

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

 

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

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

http://blog.youkuaiyun.com/morewindows/article/details/6804157

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

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

http://blog.youkuaiyun.com/morewindows/article/details/7390350

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

http://blog.youkuaiyun.com/morewindows/article/details/7390441

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

http://blog.youkuaiyun.com/morewindows/article/details/8260087

 

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

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

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

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

//进程通信之三 父进程传参数与子进程返回值
//http://blog.youkuaiyun.com/morewindows/article/details/8683830
//By MoreWindows( http://blog.youkuaiyun.com/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.youkuaiyun.com/morewindows/article/details/8683519):

//进程通信之三 父进程传参数与子进程返回值
//http://blog.youkuaiyun.com/morewindows/article/details/8683830
//By MoreWindows( http://blog.youkuaiyun.com/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.youkuaiyun.com/morewindows/article/details/8683830 -\n");
	printf(" -- By MoreWindows( http://blog.youkuaiyun.com/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.youkuaiyun.com/detail/morewindows/5165733

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

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


 


进程通信之管道(PIPE) 在前面进程通信概念和进程通信方式,我们了解了进程通信的简单概念以及4种进程通信的方式,今天我们将要通过具体实例来学习,理解进程通信方式中的管道(PIPE)。本文所有代码都在Ubuntu16.04测试。我们在前面已经了解了常用的进程间通信方式,它们大致可以以如下方式分类:A. 传统的进程间通信方式 无名管道(pipe)、有名管道(fifo)和信号(signal)B. System v IPC对象 阅读详情

相关推荐

Linux编程:waitpid父进等待子进程的退出,并获取返回值

父进程可以通过waitpid等待子进程的退出: pid_t waitpid(pid_t pid, int *status, int options); 参数说明:pid: pid<-1: 等待进程组识别码为pid 绝对值的任何子进程. pid=-1: 等待任何子进程, 相当于wait(). pid=0: 等待进程组识别码与目前进程相同的任何子进程. pid>0: 等待任何子进程识别码为pid 的子进程.status:用于获取...

风静如云的博客 1814

操作系统-父子进程通信-c语言编程实现

创建父子2个进程A,B。进程A不断获取用户从键盘输入的字符串或整数,通过信号机制传给进程B。如果输入的是字符串,进程B将其打印出来;如果输入的是整数,进程B将其累加起来,并输出该数和累加的和。当累加和大于100时结束子进程,子进程输出“My work done!”后结束,然后父进程也结束。编写程序实现,并给出测试结果。 #include <stdio.h> #include <unistd.h> #include <string.h> #include <std

bxy0806的博客 3736

DM9000有线网卡驱动编写

DM9000有线网卡驱动编写 1.DM9000简介   DM9000 是一款完全集成的、性价比高、引脚数少、带有通用处理器接口的单芯片快速以太网控制器。 自 带一个 10/100M PHY 和 4K 双字的 SRAM ,DM9000A 为适应各种处理器提供了 8 位、16 位数据接口访问 内部存储器,DM9000 拥有自动协商功能,DM9000 特性如下:   1.集成自适应 10/100M 收发器。   2.内置 16k 字节的 SRAM。   3.支持硬件帧校验。   4.兼容 3.3V 和 5.0V

weixin_44453694的博客 4672

进程管道:父进程和子进程

进程管道:父进程和子进程

884

AI 赋能测试全生命周期:多 Agent 协同的自动化提效方案

本文提出了一种基于Coze平台的多Agent协同测试解决方案,旨在解决软件测试中PRD解析不清晰、测试点覆盖不全、用例编写效率低、代码生成耗时等痛点。通过PRD优化、测试点生成、测试用例生成和单元测试框架生成四个Agent的协同工作,结合Cursor工具实现从需求到代码的全链路自动化。以电商平台登录模块为例,展示了从模糊PRD到标准化测试用例和可执行Java单元测试代码的完整转化流程。该方案通过AI赋能显著提升测试效率,减少人工干预,实现测试覆盖率≥95%,为快速迭代的软件研发提供了高效的测试自动化支持。

QINJIEEE的博客 1101

STM32F103C8T6板子使用说明

pcb版,把众多元器件集中到一个板子上面管理。

LYC_462857656的博客 2186

c语言子进程,C语言父子进程--waitpid的用法

#include #include #include #include #include #include #include int main(int argc ,char **argv){pid_t pid;pid_t pid_c;int status;pid=fork();if(pid==0){printf("child process will sleep 3 seconds\n");sle...

weixin_31002059的博客 563

论文阅读------Exposure Fusion: A Simple and Practical Alternative to High Dynamic Range Photography

Mertens T, Kautz J, Van Reeth F. Exposure fusion: A simple and practical alternative to high dynamic range photography[C]//Computer graphics forum. Oxford, UK: Blackwell Publishing Ltd, 2009, 28(1): 161-171. 摘要 本文提出了一种将包围曝光的序列融合到高质量图像中的技术,而无需先转换为高动态范围(HD.

qq_25283239的博客 3395

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

转载自:http://blog.youkuaiyun.com/morewindows/article/details/8683830 本篇介绍一个简单而又实用的进程通信方式——父进程向子进程传入参数并获取子进程返回值。这个非常简单: 1.父进程向子进程传入参数可以由CreateProcess()函数来完成,注意子进程是通过GetCommandLine()来获取这个参数而且不是char *argv[]。 ...

weixin_33716557的博客 779

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 239

优化算法 | 赏金猎人优化算法(Bounty Hunter Optimizer, BHO)及其在多无人机移动边缘计算与路径规划中的应用(附matlab源代码)

移动边缘计算(Mobile Edge Computing, MEC)通过将计算资源下沉至网络边缘,有效解决了物联网终端设备计算能力不足与能耗受限的问题。无人机(Unmanned Aerial Vehicle, UAV)因其高机动性、灵活部署和广域覆盖等优势,被广泛用作MEC的移动服务器平台。多无人机辅助MEC系统的核心优化问题在于:如何在满足任务处理时延约束和无人机能量限制的前提下,联合优化无人机的三维飞行轨迹、任务卸载决策与计算资源分配,以最小化系统总能耗或最大化任务完成效率。

尘世冰封的专栏 223

IPC(三) 父进程传参数与子进程返回值

http://blog.youkuaiyun.com/morewindows/article/details/8683830 本文配套程序下载地址为:http://download.youkuaiyun.com/detail/morewindows/5165733 转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/8646902 欢迎关注

miao6664659的专栏 1360

华为OD机试 - 停车场费用统计 - HashSet(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。停车场统计当日总收费,包月的车不统计,不包月的车半个小时收一块钱,不满半小时不收费,如果超过半小时,零头不满半小时按半小时算,每天11:30-13:30时间段不收费,如果一辆车停车时间超过8小时后不收费。现提供停车场进出车辆的统计信息,需要你来计

学Java,找哪吒 238

父进程和子进程、进程和线程

子进程继承的来自父进程的属性: ● ● ● ● ● ● ● ●已打开的文件描述符 ●实际用户ID、实际组ID、有效用户ID、有效组ID ●附属组ID ●进程组ID ●会话ID

爆椒火龙果的博客 4453

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

wait/waitpid函数等待子进程状态发生改变

wait函数与waitpid函数如何终止进程,这两个函数用来等待某个(些)子进程的状态发生改变,进程等待有几种状态,函数参数的解释,与宏定义的相关关系,使用wait/waitpid函数的代码实例。

勾栏听曲_0的博客 8765

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux获取子进程返回值,Linux 父进程如何获取子进程返回值?parent get child process return value,fork,wait,wait_pid...

【by lanmanck】创建子进程一般用fork,因为用execv后就不返回了,父进程无法跟子进程通信。这里有个例子:http://blog.youkuaiyun.com/wallwind/article/details/6998602父进程fork后,可以使用wait和wait_pid来等待子进程结束,wait/wait_pid可以阻塞也可以不阻塞,权威解析在这里:http://linux.die.net...

weixin_39986060的博客 312

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

linux--管道--父子进程之间的传输

1.管道的介绍 2.pipe函数的介绍 3.pipe函数使用示例 4.验证管道的大小 5.父子进程通过管道进行交互 6.两条管道双向运输 7.mififo有名管道 7.1mififo函数介绍 7.2函数的参数说明 7.3函数演示案例

大学成长道路上的探索经历与点滴思考,与君共勉,共筑成长。 1998

LinuxC进程通信-子进程

进程的基本概念: 1、程序与进程 程序就是存储在磁盘上的可执行文件,当程序被加载到进程中开始运行时就叫做进程, 一个程序可以被多次加载生成多个进程,进程就是处于活动状态的计算机程序 2、进程的分类 进程一般分为三种类型:交换进程、批处理进程、守护进程 守护进程一般处于活跃状态,运行于后台,由操作系统在开机时通过启动脚本自动创建 3、查看进程 简单形式: ps 显示当前用户的有终端控制的进程信息 列表形式: ps -auxw 显示出所有进程的详细信息 a 所有用户有终端控制的进程 x 无终

er_ha_er的博客 238

linux父子进程同步实验,Linux-父子进程的简单同步

int fork()功能:创建一个子进程返回值:0-创建成功,-1-创建进程失败,>0-创建进程成功,返回返回子进程idint wait(int * status)功能:将调用的进程挂起,等待子进程运行结束参数:指向整数的指针,0-子进程正常结束,非0-出现运行有误返回值:调用正常-子进程id,调用进程无子进程-调用失败,返回-1int exit()功能:终止进程的执行返回值:无sleep(...

weixin_39747807的博客 1770

【Linux】进程通信 | 管道

阿巴阿巴,关于管道的内容到这里就基本over了,我们通过匿名管道实现了控制多个子进程。通过命名管道实现了两个不相干进程之间的通信下篇博客是关于共享内存的如果有啥问题,可以在评论区提出哦!

慕雪华年的博客 1608

【Linux】进程通信

进程通信,管道文件,System V系列:共享内存,消息队列,信号量

2301_81577798的博客 1万+
上一篇: Windows VC++ 调整进程当前目录为程序可执行文件所在目录
下一篇: 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值