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++)