如何在linux中编写一个类似CreateProcess的函数

如题所述

CreateProcess函数可以创建一个新的进程并调用一个外部程序

并且它有很多参数可以设置新的进程相关的状态

如果只要想简单地完成创建一个进程并调用一个外部程序的话

在linux上可以使用fork或者clone来进行创建进程

然后使用exec族函数来调用一个外部程序

一个简单的实现大概是这样的

int create_procress(const char *path,const char *name,const char *arg)
{
    pid_t pid;

    pid=fork();
    if(pid == 0)
    {
        if(execl(path,name,arg,NULL) == -1)
        {
            perror(path);
            _exit(-1);
        }
    }
    else if(pid == -1)
        return -1;

    return 0;
}

参数path为执行外部程序的路径

name为运行程序的名称(argv[0])

arg为命令行参数(从argv[1]开始)


如果对新进程有其它需求的话比如设置环境变量等可以使用execle等进行扩展

或者其它的要求也可以使用linux提供的相应api在fork后进行设置

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-02-01
//本函数执行exepath指定的程序
//执行成功和失败无法返回
int execute_new(const char *exepath,const char *arg,unsigned int &retpid)
{
if(exepath == NULL)
{
return 0;
}

int argcount=0;
char *argv[1024]={0};
char argsave[1024]={0};
char *argline = argsave;
argv[0] = (char *)exepath;
argcount++;

////////////分割和提取参数,作为execvp函数的参数
if(arg != NULL)
{
strncpy(argsave,arg,1024-1);
int is_find_space = -1; //-1,
if(*argline != ' ')
{
argv[argcount] = (char *)argline;
argcount++;
}
while(*argline != '\0')
{
if(*argline == ' ' && *(argline+1) != ' ' && *(argline+1) != '\0')
{
argv[argcount] = (char *)(argline+1);
argcount++;
}
if(*argline == ' ')
{
*argline='\0';
}
argline++;
}
}

pid_t pid;
int status;
if((pid = fork())<0){
status = -1;
}
else if(pid == 0){
execv(exepath,argv);
_exit(127); //子进程正常执行则不会执行此语句
}
else{

retpid = pid;

waitpid(pid, &status, WNOHANG|WUNTRACED);

}
return status;
}本回答被提问者和网友采纳
第2个回答  2015-12-06
如下,使用 fork 和exec 两步
int pid = fork();
if( pid == 0 ){
exec(子进程文件)
}
相似回答