2015-12-01 18 views
0

我试图创建一个简单的程序,允许执行基本的 shell命令。问题在于execve每次都会挂起。调用ls和其他使用execve

赫雷什的代码:

char* arglist[]={"ls","-l",NULL}; 
    char* env[]={NULL}; 
    int status; 
    while (1) 
    { 
     if (fork() != 0) 
     { 
      waitpid(-1, &status, 0); 
     } 
     else 
     { 
      execve(arglist[0],arglist,env); 
     } 
    } 
    return 0; 
} 
+0

应该是'如果(叉()> 0)'因为'叉'可能会失败 –

+1

这与'bash'无关。 'ls'不是“shell命令”,它只是一个命令。 (它是在POSIX规范的“shell和utilities”一节中指定的,是的,但它是一个实用程序,而不是shell的一部分)。 –

+0

...另外,当在C中工作时,总是检查你的返回值(适当的时候是'errno'),并在不成功时调用'perror';如果你看过错误信息,你可能不需要问这个问题。 –

回答

2

第一参数应该是一个完整路径二进制你执行:

char* arglist[]={"/bin/ls", "-l", NULL}; 
+0

谢谢!有用。我怎样才能让它在没有完整路径的情况下工作? – susdu

+0

你不能。 'execve()'需要完整的路径。 –

+1

使用[execvp(3)](http://man7.org/linux/man-pages/man3/execvp.3.html) –