操作系统课程设计父子进程的简单通信以及终止进程源码解析

这篇博客探讨了操作系统课程设计中父子进程的简单通信及如何终止进程。问题主要涉及PV操作,即进程同步。在不修改代码的情况下,程序会不断创建子进程。通过修改WaitForSingleObject函数的超时参数,实现了进程的正确同步。父子进程间的通信依赖于互斥体的P操作(WaitForSingleObject)和V操作(ReleaseMutex)。在没有明确临界区的情况下,getchar()可视为父进程的临界区。子进程通过接收信号量进入临界区,执行完毕后关闭进程。
摘要由CSDN通过智能技术生成

这里的父子进程通信,其实说白了就是一个上课时候学的PV操作,是一个进程的同步,而终止进程,基本上就是关闭创建子进程的句柄,回收给子进程的资源,从而关闭这个进程。其中出现了以下的问题;

在没有修改之前:

wsprintf(szCmdLine, "\"%s\" chid" , szFilename) ;
	//将szFilename 和 nCloneID 以规定的格式写入到szCmdLine中

	STARTUPINFO si;
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);

	PROCESS_INFORMATION pi;   //这个结构体将存储CreateProcess返回的创建新的进程的一些信息以及他的主要线程
	BOOL bCreateOK = ::CreateProcess(
		szFilename,
		szCmdLine,
		NULL,
		NULL,
		FALSE,
		CREATE_NEW_CONSOLE,
		NULL,
		NULL,
		&si,
		&pi
		);
在利用createprocess函数创建进程的时候,在命令行中就需要szCmdLine这个变量才作为argv中的的参数来创建这个子进程。由于两个参数是分开的,所以在wsprintf函数里面的"\"%s\" chid"这个部分,%s这里面要填入的是可执行文件的路径,而child是为了要创建子进程。所以两个参数之间要添加上空格才可以。


修改第一次之后:

wsprintf(szCmdLine, "\"%s\" chid" , szFilename) ;将此函数的child部分改为一个其他的字符串,那么在创建进程的时候,第二个参数就不再是child,很自然,在创建子进程的时候,进入的不再是child函数,而是parent函数,所以,程序就在不断的创建子进程,没有停止的趋势。创建进程函数的大致工作原理如下:


BOOL CreateProcess( 
  LPCWSTR pszImageName, 
  LPCWSTR pszCmdLine, 
  LPSECURITY_ATTRIBUTES psaProcess, 
  LPSECURITY_ATTRIBUTES psaThread, 
  BOOL fInheritHandles, 
  DWORD fdwCreate, 
  LPVOID pvEnvironment, 
  LPWSTR pszCurDir, 
  LPSTARTUPINFOW psiStartInfo, 
  LPPROCESS_INFORMATIO
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值