📜  演示fork()和pipe()的C程序

📅  最后修改于: 2021-05-30 13:19:20             🧑  作者: Mango

编写Linux C程序来创建两个进程P1和P2。 P1接收一个字符串并将其传递给P2。 P2在不使用字符串函数的情况下将接收到的字符串与另一个字符串连接起来,然后将其发送回P1进行打印。

例子:

Other string is: forgeeks.org

Input  : www.geeks
Output : www.geeksforgeeks.org
        
Input :  www.practice.geeks
Output : practice.geeksforgeeks.org

解释:

  • 要创建子进程,我们使用fork()。 fork()返回:
    • <0无法创建子进程(新)
    • = 0对于子进程
    • > 0,即子进程到父进程的进程ID。 > 0时,将执行父进程。
  • pipe()用于将信息从一个进程传递到另一个进程。 pipe()是单向的,因此,对于进程之间的双向通信,可以设置两个管道,每个方向一个。
    Example: 
     int fd[2];
     pipe(fd);
     fd[0]; //-> for using read end
     fd[1]; //-> for using write end
     

内部父进程内部:我们首先关闭第一个管道的读取端(fd1 [0]),然后通过管道的写入端(fd1 [1])写入字符串。现在,父级将等待子进程完成。子进程完成后,父进程将关闭第二个管道(fd2 [1])的写入端,并通过管道的读取端(fd2 [0])读取字符串。

内部子进程:儿童通过闭合管(FD1 [1])的书写端和读取串连后两者字符串读取由父进程发送的第一字符串和通过FD2管材通过该字符串父进程和将退出。

// C program to demonstrate use of fork() and pipe()
#include
#include
#include
#include
#include
#include
  
int main()
{
    // We use two pipes
    // First pipe to send input string from parent
    // Second pipe to send concatenated string from child
  
    int fd1[2];  // Used to store two ends of first pipe
    int fd2[2];  // Used to store two ends of second pipe
  
    char fixed_str[] = "forgeeks.org";
    char input_str[100];
    pid_t p;
  
    if (pipe(fd1)==-1)
    {
        fprintf(stderr, "Pipe Failed" );
        return 1;
    }
    if (pipe(fd2)==-1)
    {
        fprintf(stderr, "Pipe Failed" );
        return 1;
    }
  
    scanf("%s", input_str);
    p = fork();
  
    if (p < 0)
    {
        fprintf(stderr, "fork Failed" );
        return 1;
    }
  
    // Parent process
    else if (p > 0)
    {
        char concat_str[100];
  
        close(fd1[0]);  // Close reading end of first pipe
  
        // Write input string and close writing end of first
        // pipe.
        write(fd1[1], input_str, strlen(input_str)+1);
        close(fd1[1]);
  
        // Wait for child to send a string
        wait(NULL);
  
        close(fd2[1]); // Close writing end of second pipe
  
        // Read string from child, print it and close
        // reading end.
        read(fd2[0], concat_str, 100);
        printf("Concatenated string %s\n", concat_str);
        close(fd2[0]);
    }
  
    // child process
    else
    {
        close(fd1[1]);  // Close writing end of first pipe
  
        // Read a string using first pipe
        char concat_str[100];
        read(fd1[0], concat_str, 100);
  
        // Concatenate a fixed string with it
        int k = strlen(concat_str);
        int i;
        for (i=0; i
Input : www.geeks
Output : Concatenated string
         www.geeksforgeeks.org


参考:

http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/wait.html
http://searchenterpriselinux.techtarget.com/definition/pipe

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。