簡體   English   中英

帶有execlp的c中的匿名管道

[英]anonymous pipes in c with execlp

我要為我的大學做作業,其中必須有一個主要過程和三個子過程。 我必須在用戶的主進程中讀取一個表達式,然后在p1進程中通過重定向標准輸入將其通過匿名管道傳遞。 然后,我必須修改它,並將其與另一個管道傳遞給p2。 然后,使用另一個管道的p3也會發生相同的情況。 最后,我必須使用另一個管道將最終表達式從p3返回到主進程。 當我通過調用fork在主進程中創建p1,p2,p3進程時,我使用execlp來運行每個進程的代碼。

到目前為止,我設法做到的(除了每個流程的邏輯非常復雜之外),是將用戶的表達從主流程發送到p1流程。 在主流程的p1代碼內部,我將p1的輸入重定向到第一個管道的讀取端,並且我成功地從主流程讀取了表達式。

我的問題是其他過程。 我真的迷上了如何正確重定向每個管道的輸入和輸出以與所有進程進行通信的方法。 我真的很感謝這里的任何幫助。 先感謝您。

根據您的描述,我認為您想進行鏈式分叉。 例如,不要讓主叉創建3次來創建p1,p2和p3,而是讓主叉一次創建p1,然后讓p1叉一次創建p2,也讓一次叉創建p3。

在此示例中,您可以看到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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM