2012-11-21 30 views
1

下面的代码调用LS应该调用命令excve由于某种原因,我不打印当前目录中的内容,但仍程序返回"ok"与execve的

1 #include <stdio.h> 
    2 #include <unistd.h> 
    3 int main() 
    4 { char *argv[]={"ls",NULL};· 
    5 char *env[]={"PATH=/usr/local/sbin/:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games",NULL}; 
    6 if(execve("ls",argv,env)) 
    7 { printf("ok\n"); 
    8 } 
    9 else 
10 { printf("not ok\n"); 
11 } 
12 return 0; 
13 }  

回答

3

由于execve没有成功返回,显然这个调用失败了。它在错误时返回-1,将被视为true(非零)。这就是为什么它说好。

最可能的原因是您没有指定可执行文件的完整路径,这是execve的要求。或者,如果您想要搜索路径,请改为使用execvpe。血腥的细节见http://linux.die.net/man/3/exec

1

的execve返回-1错误当在需要布尔值的上下文中使用时,它的计算结果为true。但是,检查返回值没有意义,因为如果execve成功,则不会返回。

可能在这种情况下,它失败了,因为您没有提供'ls'的完整路径。

2

调用exec在成功时不会返回。你基本上用你正在使用的程序替换调用程序。

因此,如果您曾经运行任何代码执行,它意味着exec失败。我相信exec返回-1,这就是为什么你最终打印好。

1

这并不真正使多大意义

if(execve("ls",argv,env) >0) { 
    printf("ok\n"); 
} else { 
    printf("not ok\n"); 
} 

如果他们成功了所有exec函数不返回,所以如果它返回它意味着它失败了,你也不需要检查它是否返回-1,第二个问题是,第一个参数是execve()文件路径不是命令名,从这个男人:

的execve()执行程序的文件名指出到。

所以,你只需要:

execve("/bin/ls", argv, env); 
/* execve() only returns on error */ 
perror("execve"); 
exit(EXIT_FAILURE);