带有execlp的c中的匿名管道

时间:2014-04-01 10:38:52

标签: c redirect pipe

我为我的大学做了一项功课,我必须有一个主要流程和3个子流程。我必须从用户那里读取主进程中的表达式,然后在p1进程中通过匿名管道传递它,并重定向标准输入。然后我必须修改它并将其与另一个管道传递给p2。然后p3与另一个管道发生同样的事情。最后,我必须使用另一个管道将最终表达式从p3返回到主进程。当我通过调用fork在主进程中创建p1,p2,p3进程时,我使用execlp来运行每个进程的代码。

我到目前为止所做的事情(除了每个进程的逻辑非常复杂),是将用户的表达式从主进程发送到p1进程。在主进程中的p1代码中,我重定向到p1的输入到第一个管道的读取端,并且我成功地从主进程读取了表达式。

我的问题在于其他流程。我真的陷入了如何正确地重定向每个管道的输入和输出以与所有进程通信的问题。我真的很感激这里的任何帮助。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

根据您的描述,我认为您想要连锁分叉。例如。而不是使用主叉三次创建p1,p2和p3,而是让主叉一次创建p1,然后让p1 fork一次创建p2,它也会分叉一次创建p3。

答案 1 :(得分:0)

在本例中,您可以看到execlp()函数和fork()函数:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
   pid_t pid;
   char *pathvar;
   char newpath[1000];

   pathvar = getenv("PATH");
   strcpy(newpath, pathvar);
   strcat(newpath, ":u/userid/bin");
   setenv("PATH", newpath);

   if ((pid = fork()) == -1)
      perror("fork error");
   else if (pid == 0) {
      execlp("newShell", "newShell", NULL);
      printf("Return not expected. Must be an execlp error.n");
   }
}

在这里,您可以看到如何在两个进程之间建立管道:

/*
 “ls -R | grep <pat>” where <pat> is a pattern
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv [])
{
    int pipe1[2];
    int pid1;
    int pid2;
    char stringa[100];

    pipe(pipe1); // creo la pipe

    if((pid1=fork())==0)
    {
        close(pipe1[0]);
        dup2(pipe1[1],1);
        close(pipe1[1]);
        execlp("ls","ls","-R",NULL);
    }

    if((pid2=fork())==0)
    {
        close(pipe1[1]);
        dup2(pipe1[0],0);
        close(pipe1[0]);
        execlp("grep","grep",argv[1],NULL); 
    }

    close(pipe1[0]);
    close(pipe1[1]);
    waitpid(pid1,NULL,0);
    waitpid(pid2,NULL,0);
    exit(0);

}