用户必须输入命令,程序才能执行它。 我使用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;
}
答案 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
中。 execlp
和the other exec
functions with p
in the name的重点是,他们会在$PATH
中为您寻找所请求的计划。
为了帮助将来调试此类事情,或者如果这不起作用,您应该在每次系统调用之后检查errno
(perror
在你fork
之后做的。当exec*()
- 家庭功能起作用时,它们不会返回;当他们失败时,他们会在返回前适当地设置errno
。