博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows、linux创建子进程
阅读量:6799 次
发布时间:2019-06-26

本文共 1530 字,大约阅读时间需要 5 分钟。

在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返回给子进程。

转载地址:http://byywl.baihongyu.com/

你可能感兴趣的文章
八、 异步调用WebService
查看>>
全文检索、数据挖掘、推荐引擎系列---去除停止词添加同义词
查看>>
织梦模板修改方法大全
查看>>
android 开发之电子钢琴 源码
查看>>
Grid.SharedSizeGroup
查看>>
每个开发人员现在应该下载的十种必备工具
查看>>
ubuntu11.10真机调试no-permissions
查看>>
如何判断某个事件已经绑定了某个事件处理程序?
查看>>
zipimport — Import modules from Zip archives¶
查看>>
金山快盘登陆签到
查看>>
C#中类的概念
查看>>
Primary key、unique、index之间的关系
查看>>
关于完美的练习
查看>>
heap&stack 区别
查看>>
hadoop hive安装手记(转)
查看>>
kinect新知
查看>>
堆实例
查看>>
ASP.NET中各个后缀名的含义
查看>>
always和always@(*)
查看>>
Android 中压力测试工具Monkey的用法(转)
查看>>