我正在使用linux,我想在c中编写一个程序,从用户读取命令,直到我进入stop。对于每个命令,主程序将创建一个进程A,它将创建另一个进程B.进程B将执行用户输入的命令。我希望使用exec使其工作,但它只适用于一个单词命令(例如:pwd
,ls
),如果我输入例如ls -l
它表示没有这样的文件或目录。到目前为止我写的代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define N 100
int main() {
char input[N];
scanf(" %[^\n]s",input); //reads from user inputs that can include space
while (strcmp(input,"stop") != 0) { // verifies if entered command == stop
int a;
a = fork();//creates the process A
if (a == -1) {
perror("fork imposibil!");
exit(1);
}
if (a == 0) {
printf("a\n");//i printed that to verify if my fork works
int b;
b = fork();//creates process B
if (b == -1) {
perror("fork imposibil!");
exit(1);
}
if (b == 0) { // the part that makes me problems , i try to use exec to execute the command that is stored in input
printf("b\n");
if (execlp(input,"",(char*) 0) < 0) {
perror("Error exec");
exit(0);
}
exit(0);
}
wait(0);
exit(0);
}
wait(0);
scanf(" %[^\n]s",input);
}
return 0;
}
是的,有人能帮帮我吗?
附:我不认为我的代码是如此难以阅读,但我希望它现在更好
答案 0 :(得分:2)
从您的示例ls -l
中,-l
应该传递给参数。
int execlp(const char *file, const char *arg, ...);
来自help的引文说
该功能可以被认为是arg0,arg1,...,argn。他们在一起 描述一个或多个指向以null结尾的字符串的指针的列表 表示执行程序可用的参数列表。 按照惯例,第一个参数应指向文件名 与正在执行的文件相关联。参数列表必须是 由NULL指针终止,因为这些是可变参数函数, 必须将此指针强制转换为(char *)NULL。
答案 1 :(得分:0)
您没有按照预期的方式将参数传递给函数execlp()。
这些函数的初始参数是文件的名称 被执行。
execl(),execlp()中的const char * arg和后续省略号, 和execle()函数可以被认为是arg0,arg1,...,argn。 他们一起描述了一个或多个指针的列表 以null结尾的字符串,表示可用的参数列表 执行的程序。按惯例,第一个论点应该指出 到与正在执行的文件关联的文件名。清单 参数必须由NULL指针终止,因为它们是 可变参数函数,必须将此指针强制转换为(char *)NULL。
看一下如何使用execlp()函数的这个解释 - I do not understand how execlp() works in Linux
我猜你必须使用带分隔符" "
的字符串拆分器函数来获取-l
中ls -l
之类的命令行参数。
strtok()
在C。
#include <string.h>
#include <stdio.h>
int main(void)
{
char input[] = "A bird came down the walk";
printf("Parsing the input string '%s'\n", input);
char *token = strtok(input, " ");
while(token) {
puts(token);
token = strtok(NULL, " ");
}
printf("Contents of the input string now: '");
for(size_t n = 0; n < sizeof input; ++n)
input[n] ? printf("%c", input[n]) : printf("\\0");
puts("'");
}