Execlp不工作

时间:2018-03-24 19:36:23

标签: c linux shell

用户必须输入命令,程序才能执行它。 我使用fork()和execlp()但不工作。我正在打印comando和ruta以确定它们是否良好。我不知道如何让它与众不同才能使其发挥作用。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<string.h>

int main(){
char comando[10];
char ruta[40];
printf("Type a command: ");
fgets(comando,10,stdin);

pid_t pid;
pid = fork();

if (pid < 0){
    perror("Error");
    return -1;
}
else if (pid == 0){ 
strcpy (ruta,"/bin/");
strcat (ruta,comando);
printf("%s",ruta);
printf("%s",comando);
execlp(ruta, comando,NULL);   
}
else{
    wait(NULL); }

return 0;
}

2 个答案:

答案 0 :(得分:2)

execlp由于fgets()而未在fgets()的{​​{1}}副本中new line复制,因此不是执行命令。请参阅comando

的手册页

删除新行

fgets()

或者你可以按照@Jonathan Leffler的建议使用下面的fgets(comando,sizeof(comando),stdin); comando[strlen(comando)-1] ='\0'; /* replacing '\n' with '\0' */

strcspn()

完整的工作代码

comando[strcspn(comando, "\n"))] = '\0';

答案 1 :(得分:1)

并非所有可执行文件都在/bin中。 execlpthe other exec functions with p in the name的重点是,他们会在$PATH中为您寻找所请求的计划。

为了帮助将来调试此类事情,或者如果这不起作用,您应该在每次系统调用之后检查errnoperror在你fork之后做的。当exec*() - 家庭功能起作用时,它们不会返回;当他们失败时,他们会在返回前适当地设置errno