所以我有以下代码:
int main(int argc, char *argv[])
{
int a=1;
while(argv[a] != NULL)
{
printf("\nargv[a] = %s\n", argv[a]);
execl("/bin/ls", "ls", argv[a], NULL);
a++;
}
return 0;
}
我想列出三个名为tickets1.lot,tickets2.lot,tickets3.lot的文件。但是当我以这种方式运行程序时:
./ code ../ input / .lot *
我只列出第一个:
argv [a] = ../ input / tickets1.lot
../输入/ tickets1.lot
我的while循环条件有什么问题吗?
答案 0 :(得分:4)
我只列出第一个:?那是因为你没有正确理解execl()
。第一次execl()
替换当前流程(a.out
)与新流程&完成后,循环不会再次迭代,因为没有进程正在运行。
您应该使用fork()
&创建子流程在每个子进程中运行execl()
。而不是argv[a] != NULL
使用argc
。
示例代码
int main(int argc, char *argv[]) {
int a = 0;
while(++a < argc) { /* check this condition, how many process are there, that many times it should iterate */
printf("\nargv[a] = %s\n", argv[a]);
if(fork()) { /*every time parent process PCB replaced by /bin/ls process */
execl("/bin/ls", "ls", argv[a], NULL);
//a++; /*this will not execute */
}
else
;
}
return 0;
}
来自execl()
家庭功能的手册页
exec()函数系列取代了当前的过程映像 使用新的过程映像。并且只有在发生错误时才会返回exec()函数。
因此,只有在发生错误时才会执行execl()
调用后执行的操作。例如
execl("/bin/ls", "ls", NULL); /* ls is the new process, old process is a.out if you are not creating process using fork() */
a++; /* this will not execute bcz above statement replaces a.out process with new process called ls */
答案 1 :(得分:-3)
尝试这样做!
#include <iostream>
int main(int argc, char** argv)
{
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i)
{
std::cout << argv[i] << std::endl;
}
}