红联Linux门户
Linux帮助

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

发布时间:2012-04-11 18:25:51来源:红联作者:quietjolt
我目前的需求的是在linux中编写一个类似Windows CreateProcess函数的自定义函数,功能需求有以下几点

1.程序执行完成之后立即返回,不需要返回创建的程序的执行结果,而是需要返回子程序是否 fork 成功

2.子进程执行完成后自动退出,不需要形成僵尸进程等待父进程回收

3.子进程不继承父进程的任何资源(文件描述符...)

我目前的实现是 fork() + exec() + waitpid(pid,&status,WNOHANG | WUNTRACED) <---------不等待直接退出
遇到以下几个问题:
1.父进程无法获取子进程exec是否执行成功
2.有的时候还会出现僵尸进程
3.子进程会继承父进程打开的文件描述符(请教如何使用 clone 解决此问题)

请教我应该怎么修改才能达到我的要求?
或者那个库里面有类似的实现,我可以研究一下

代码:[code]//本函数执行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;
}
[/code]
文章评论

共有 1 条评论

  1. urowoen 于 2012-04-12 08:50:16发表:

    路过