我目前的需求的是在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]
urowoen 于 2012-04-12 08:50:16发表:
路过