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

  • 相关阅读:
    ADO.NET_01_概述
    我对持久层的一点看法
    浅谈极限编程(XP)和代码重构(Refectoring)
    设计模式_第一篇_开场
    .NET OracleLob 读写操作
    ASP.NET_ASP.NET Cookies
    设计模式_第二篇_策略模式
    Oracle_C# 实现 Oracle Text(全文检索)的一个简单例子
    IKVM.NET_06_用户指南_教程
    ADO.NET_02_DataTable
  • 原文地址:https://www.cnblogs.com/lidabo/p/4245522.html
Copyright © 2020-2023  润新知