与execv和输入重定向C ++流水线命令(c++ pipelining commands with

2019-09-17 18:14发布

尝试写处理内部和外部命令的壳。 我能得到的内部命令,并一次一个外部。

我的问题是如何获得这样的命令来运行:“ls -l命令| grep的LIB |厕所-l”

我使用fork()的,并通过execv()在一个char * []通过外部命令。

任何思考如何工作的呢? 我想使用管道()或东西,但我不知道。

问题的第二部分:关于如何与我打交道/ O重定向? 任何人都可以点我到某个地方有帮助吗?

编辑到目前为止,@Alex W是我心目中的英雄。 然而,由于我是新来的管道()和DUP2()命令,我什么每个呼叫和变量是有点犹豫。

下面是我有一个处理单个外部指令的代码(实施例=“LS -l -a”):

    pid_t pid;
    pid = fork();
    if (pid < 0)
    {
        cout << "Fork failed." << endl;
    }
    else if (pid == 0)
    {
        execvp(exec_args[0], exec_args);   //exec_args is a char*[] where 
        _exit (EXIT_FAILURE);              //exec_args[0] contains "/bin/ls"
    }                                          //[1]="ls" and [2]="-l" [3]="-a"
    else
    {
        int status;
        waitpid(pid, &status, 0);
    }
    break;

Answer 1:

你使用pipe和POSIX系统的管道以类似的方式工作的文件。 您可以写信给管道并从管道中读取,但如果没有在管阻塞。 找到Unix系统调用的信息最好的地方是系统调用的手册页。 在Unix系统中你可以键入man pipe到终端。 如果您没有访问到Unix终端则只是谷歌“人管”。 有关手册页的好处是,他们告诉你什么库中包括为给定的系统调用。 请务必记住,使用任何时候exec类型的系统调用你加载一个完全新的进程到内存而你正执行将在其轨道上停止死亡的过程。

要使用它做这样的事情:

int main()
{
    int id[2];
    int fd[2];
    int fd2[2];
    int fd3[2];
    FILE file;
    int status;
    int sz = 0;
    char buff[1000];
    char buff2[1000];
    string launch[2];
    FILE *fp;

    launch[0] = "./anotherProgramToExecute";
    launch[1] = "./yetAnotherProgram";

    pipe(fd);
    pipe(fd2);
    pipe(fd3);

    for(int i = 0; i < 2; i++)
    {
        id[i] = fork();

        if (id[i] == -1) /* an error occurred */
        {
            perror("Fork failed.\n");
        }
        else if (id[i] == 0) /* this is the child process currently acting */
        {
            if(i == 0)
            {
                dup2(fd[1],1);
            }
            else if(i == 1)
            {
                dup2(fd2[0],0);
                dup2(fd3[1],1);
            }
            execlp(launch[i],launch[i], NULL);
        }
        else /* this is the parent process currently acting */
        {
            sz = read(fd[0], buff, 1000);
            buff[sz] = '\0';
            printf("buff = %s\n",buff);

            close(fd[0]);

            write(fd2[1],buff, 1000);

            read(fd3[0],buff2,1000);

            fp = fopen("bin.txt","w");
            if(fp == NULL)
                printf("Cannot open file.\n");
            else
            {
                fprintf(fp,buff2);
                fclose(fp);
            }

            //printf("Creation of Child Process #%d succeeded!\n",id[i]);
            while(waitpid(id[i], &status, WNOHANG) == 0)
                sleep(0.3);
            if (WIFEXITED(status))
            { 
                // successfully terminated children
            }
            else
            {
                perror("Child has not terminated correctly.\n");
            }
        }
    }
}


Answer 2:

最好的在线教程,我已经看到了关于管道和这种是一个过时的歌曲,但糖果: http://beej.us/guide/bgipc/ 。 你可能会浏览它。 有人怀疑你会喜欢它。



文章来源: c++ pipelining commands with execv and input redirection