windows、linux创建子进程
在windows下创建子进程较常用到的API就是CreateProcess,可以通过以下的方式启动一个新进程:
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(STARTUPINFO); //结构体大小
GetStartupInfo(&si); //初始化结构
si.wShowWindow = SW_HIDE; //新进程不显示窗口
si.dwFlags = STARTF_USESHOWWINDOW; //令si.wShowWindow生效
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcess( NULL, //可执行文件名,为NULL时,通过szCmdLine提供
szCmdLine, //命令行参数
NULL, //指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。
//如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
NULL, //指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。
//如果lpThreadAttributes参数为空(NULL),那么句柄不能被继承。
FALSE, //指示新进程是否从调用进程处继承了句柄
NULL, //指定附加的、用来控制优先类和进程的创建的标志
NULL, //指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境
NULL, //子进程的工作路径,当进程名为相对路径时,必须填写
&si, //指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体
&pi)) //指向一个用来接收新进程信息的PROCESS_INFORMATION结构体
{
return false;
}
WaitForSingleObject(pi.hProcess,INFINITE); //等待子进程结束
CloseHandle(pi.hThread); //关闭新进程的主线程
CloseHandle(pi.hProcess); //关闭新进程
在linux下创建子进程:
pid_t pid;
if(( pid = fork()) == -1 ) //创建子进程
{
exit(0); //创建进程失败,退出程序
} else if(pid == 0) { //子进程空间
char *args[]={FileMonitor, "-fp", lmonitorList[num].lm_strDirectory, NULL};
if(execve(FileMonitor, args, NULL)< 0) { //在子进程中调用FileMonitor进程
printf("execve ./wisFileMonitor -fp %s failed in the child process!/n", lmonitorList[num].lm_strDirectory);
CREATE_THREAD(StartMonitorThread, (THREAD_PARAM) num);
}
} else { //父进程空间
lmonitorList[num].lm_pid = pid;
lmonitorList[num].lm_bstop=false;
}
如果在创建子进程时,没有出现任何错误,fork函数将返回两次,一次在父进程中,另一次在子进程中。fork函数将新创建的子进程ID返回给父进程,并将0返回给子进程。
windows、linux创建子进程的更多相关文章
- Linux 创建子进程执行任务
Linux 操作系统紧紧依赖进程创建来满足用户的需求.例如,只要用户输入一条命令,shell 进程就创建一个新进程,新进程运行 shell 的另一个拷贝并执行用户输入的命令.Linux 系统中通过 f ...
- windows下创建子进程过程中代码重复执行问题
windows在启动子进程的时候会将主进程文件倒入到子进程中.导入模块就相当于执行这个模块中的代码, 所以第一个print会在主进程中执行一次,又在被导入的过程中在子进程中又执行了一次. p.star ...
- linux创建子进程--fork()方法
(1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...
- 【操作系统】linux创建子进程--fork()方法
(1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...
- Windows和Linux创建软链接和硬链接
1.Wondows创建软链接和硬链接 mklink [/d] [/h] link target /d--创建目录软链接:默认为文件软链接:创建目录链接时必须使用该选项不然创出的软链接无效 /h--创建 ...
- 使用Active Database Duplication创建跨平台Data Guard设置 (Windows/Linux) (Doc ID 881421.1)
Using Active Database Duplication to Create Cross Platform Data Guard Setup (Windows/Linux) (Doc ID ...
- Linux fork创建子进程
1. pid_t fork(void); 功能:创建父子进程 参数:无 返回值:成功:在父进程中:返回值为子进程的PID 在子进程中:返回值为0 失败:-1 注意: 1)fork函数是用来创建进程的 ...
- 如何修改文件的 “创建时间” 和 “修改时间”(Windows Linux macOS)
请访问原文链接:https://sysin.org/blog/how-to-change-file-date,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页:www ...
- 怎么在自己的windows上创建虚拟机(linux centos7)
怎么在自己的windows上创建虚拟机(linux centos7) 作为一个非科班出身自学的小白,踩过很多的坑,特此留下记录 宿主机:windows10系统 8G 64位操作系统 虚拟机:linux ...
随机推荐
- View的工作原理(一)——Measure
一.认识ViewRoot和DecorView 当Activity对象被创建的时候,会将DecorView添加到Window中,同时创建ViewRootImpl对象(ViewRoot对应于ViewRoo ...
- MYSQL 维护表的常用 5 方法
方法 1. analyze table: 本语句用于分析和存储表的关键字分布.在分析期间,使用一个读取锁定对表进行锁定.这对于MyISAM, BDB和InnoDB表有作用. 方法 2. CHECK T ...
- jquery实现导航栏鼠标点击后实行背景高亮,点击离开恢复(超级简单!!!!),jquery导航栏
1.header部分要引入Jquery <asp:Content ID="HeaderContent" runat="server" ContentPla ...
- Oracle EBS-SQL (MRP-4):检查例外信息查询_建议取消_采购申请.sql
select msi.segment1 编码 ,msi.description 描述 ,mr.old_order_quantit ...
- Windows下Node.js开发环境搭建
1.http://nodejs.org/下载node.js运行环境安装 2.打开DOS命令行 .安装express框架 1 >npm install express 末尾显示如下为安装成功 .安 ...
- stream~filestream
http://blog.csdn.net/feliciafay/article/details/6157356 http://blog.csdn.net/feliciafay/article/deta ...
- qt 自动完成LineEdit
原地址:http://www.cppblog.com/biao/archive/2009/10/31/99873.html ---------------------------------- ...
- Unix/Linux环境C编程入门教程(27) 内存那些事儿
calloc() free() getpagesize() malloc() mmap() munmap()函数介绍 calloc(配置内存空间) 相关函数 malloc,free,realloc,b ...
- poj 2704 Pascal's Travels_记忆化搜索
一道简单但是题意蛋疼的题目 题意:给你个n*n的图,开始在左上角,要求走到右下角有多种走法,图上的数表示走几步,只能向右或向下走. #include<iostream> #include& ...
- SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET
SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET SAE利用storge上传文件