运行带有通配符作为参数的程序

时间:2018-05-12 19:32:12

标签: c command-line-arguments

所以我有以下代码:

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循环条件有什么问题吗?

2 个答案:

答案 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;
    }
}