如何在linux中编写一个类似CreateProcess的函数
3个回答
展开全部
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后进行设置
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;
}
//执行成功和失败无法返回
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;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如下,使用 fork 和exec 两步
int pid = fork();
if( pid == 0 ){
exec(子进程文件)
}
int pid = fork();
if( pid == 0 ){
exec(子进程文件)
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询