请原谅我在我之前的回答中转移了手头的事情(通过建议使用线程)。由于我要在这里走向一个全新的方向,我觉得有必要将其添加为单独的答案。
短版:
请在您的程序中进行以下更改:
1. length = argc; // in place of length = sizeof(argv);
2. execl(argv[i],argv[i],0); // in place of execvp(argv[i],0);
3. #include <unistd.h> // if you haven't already
加长版:
(1) 通过变量length,我假设您想获取参数的总数。 argv 是 pointer-to-char-pointer,因此只是一个内存地址。如果您在程序中打印出长度,您会注意到它始终为 4(或系统中内存地址的大小)。
所以这个:
length = sizeof(argv);
应该是这样的:
length = argc;
argc 保存执行进程时传递的参数总数。例如,
./a.out /bin/ps /bin/ls
给出:argc = 3(而不是 2,这是一个非常常见的陷阱)
(2) 程序的另一个问题是execvp 调用。
execvp 的原型如下:
int execvp(const char *file, char *const argv[]);
其中,argv 是传递给新命令的参数列表,与您自己程序中的 argv 非常相似。
您在程序中使用的是:
execvp(argv[i],0);
假设i=1 和argv[1] = "/bin/ls"。
该命令的作用是查找 /bin/ls 可执行文件并将 NULL 指针 (0) 传递给它。这可能会导致以下运行时错误:
A NULL argv[0] was passed through an exec system call.
参考 exec 手册页,
第一个参数,按照惯例,
应该指向文件名
与文件相关联
执行。
虽然不必再次传递文件名,但您当然不应该传递 NULL 指针。由于您不想传递任何参数,我建议您改用以下execl 调用:
execl(argv[i],argv[i],0);
请记住,所有此类调用最终都会转换为execve(),然后执行,最终使它们等效。
我鼓励您使用man 阅读有关exec 系列函数的更多信息。