在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创建子进程的更多相关文章

  1. Linux 创建子进程执行任务

    Linux 操作系统紧紧依赖进程创建来满足用户的需求.例如,只要用户输入一条命令,shell 进程就创建一个新进程,新进程运行 shell 的另一个拷贝并执行用户输入的命令.Linux 系统中通过 f ...

  2. windows下创建子进程过程中代码重复执行问题

    windows在启动子进程的时候会将主进程文件倒入到子进程中.导入模块就相当于执行这个模块中的代码, 所以第一个print会在主进程中执行一次,又在被导入的过程中在子进程中又执行了一次. p.star ...

  3. linux创建子进程--fork()方法

    (1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...

  4. 【操作系统】linux创建子进程--fork()方法

    (1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...

  5. Windows和Linux创建软链接和硬链接

    1.Wondows创建软链接和硬链接 mklink [/d] [/h] link target /d--创建目录软链接:默认为文件软链接:创建目录链接时必须使用该选项不然创出的软链接无效 /h--创建 ...

  6. 使用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 ...

  7. Linux fork创建子进程

    1.  pid_t fork(void); 功能:创建父子进程 参数:无 返回值:成功:在父进程中:返回值为子进程的PID 在子进程中:返回值为0 失败:-1 注意: 1)fork函数是用来创建进程的 ...

  8. 如何修改文件的 “创建时间” 和 “修改时间”(Windows Linux macOS)

    请访问原文链接:https://sysin.org/blog/how-to-change-file-date,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页:www ...

  9. 怎么在自己的windows上创建虚拟机(linux centos7)

    怎么在自己的windows上创建虚拟机(linux centos7) 作为一个非科班出身自学的小白,踩过很多的坑,特此留下记录 宿主机:windows10系统 8G 64位操作系统 虚拟机:linux ...

随机推荐

  1. SQL Server 中索引的禁用与删除

    主题 1. 禁用索引 alter index index_name on table_name disable; 主题 2. 删除索引 drop index table_name.index_name ...

  2. 正式学习React (六) 项目篇

    https://github.com/huenchao/yingshili 或者点这里 注意事项看ReadME.md 会持续更新,反正就是把之前分析的redux react-redux都用一下,然后会 ...

  3. JavaScript 获取 Div 的坐标

    示例代码: <html> <head> <script> function CPos(x, y) { this.x = x; this.y = y; } /** * ...

  4. C语言的本质(26)——C标准库之数值字符串转换

    C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. #include <stdlib.h> int atoi(const char *nptr); a ...

  5. Debian安装JAVA环境(转载)

    Debian官方没有维护专门的Java软件包,所以不能直接用apt-get工具来安装.在Debian系统中要安装Java,有两种方式,一种是用传统方式:一种是Debian方式. 1. 传统方式 在 s ...

  6. VS2008常见编译错误(总结篇)

    错误1:fatal error C1853: “Debug\mydll.pch”预编译头文件来自编译器的早期版本 项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为 ...

  7. Tsinghua dsa mooc pa1

    第一题Range 关键:二分查找,查找不大于一个数的最大下标. #include <cstdlib> #include <cstdio> 4 int compare (cons ...

  8. maven将jar包安装到本地仓库的命令

    进入cmd 执行以下命令: mvn install:install-file -Dfile=E:\sqljdbc4.jar -DgroupId=com.microsoft.sqlserver -Dar ...

  9. L10 安装网卡驱动

    一.安装网卡驱动 1. 检查各种依赖包是否安装 2. 安装 加载网卡驱动: ip:

  10. How to recover a skipped tablespace after an incomplete recovery with resetlogs? [ID 1561645.1]

    n this Document   Goal   Solution This document is being delivered to you via Oracle Support's Rapid ...