C中的execvp不通过ar

我正在尝试使用exec来执行作为参数给出的命令列表。

在运行程序时输入的示例将是./assn2 ls date。

当我这样做时,只执行第一个命令。

 #include #include #include #include int main(int argc, char *argv[]) { int args = argc-1; pid_t childpid = fork(); // error if (childpid  0) { printf("Child process has begun. %d argument/s provided\n", args); int i; for (i = 1; i <= argc; i++) { execlp(argv[i], argv[i], NULL); } execvp(argv[1], argv); } else { printf("No arguments provided, terminating child\n"); } return 0; } 

一旦第一个子进程执行(并且成功), for循环就不再继续,因为execlp只是用正在执行的命令替换当前进程映像。

你想要做的是循环父进程中的命令行参数,并为每个命令执行一次exec。 可能是你想要的东西:

  for(int i = 1; i < argc; i++) { pid_t pid = fork(); if (pid == 0) { execlp(argv[i] ,argv[i], (char*)0); perror("exec"); } else if (pid > 0) { wait(NULL); } else { perror("fork"); exit(1); } } 

你想用顺序调用execlp()execvp()什么? 这些function并不意味着返回。 我想你应该阅读参考 :

exec()系列函数用新的过程映像替换当前过程映像。 [..] exec()函数仅在发生错误时返回。

因此,您无法在同一过程中一个接一个地执行它们。

阅读fork() :

fork()通过复制调用进程来创建一个新进程。


此外,这里:

 for(i = 1; i <= argc; i++) 

你越界了,因为argv从0开始索引,结束于argc - 1

Chnage它:

 for(i = 1; i < argc; i++)