在进程之间正确管道

时间:2017-03-03 02:13:57

标签: c piping

问题:Parent将从键盘读取一个整数,并使用管道向其子作业之一发送一个值。孩子将采取该值并将其传递给下一个孩子。另一个孩子将为收到的值添加一个。然后,此子项将值传递回父级,父级将打印到屏幕。这将重复进行,直到给出EOF作为输入。

坦率地说,这是一次实验练习,我认为我把它弄下来,但我不清楚某些逻辑。对于我的代码,预期的输出将在第一次工作,但只是第一次。第一次运行后给出的任何输入都将导致没有响应或不正确的行为(例如将值传递给子级而没有任何反应)。

public class snake {

    public static void main(String[] args) {
        int[][] matrix = new int[5][7];
        putNumbers(matrix);
        printMatrix(matrix);
        System.out.println("the matrix is snake? " + isSnake(matrix, matrix.length));
    }

    private static Boolean isSnake(int[][] matrix, int length) {
        length--;
        int calc,
        odd = -1,
        even = 1;
        for (int i = 0; i < (matrix[length].length - 2); i++) {
            calc = matrix[length][i] - matrix[length][i + 1];
            if (length % 2 == 0) {
                System.out.println(calc != odd); //value is false - prints
                if (calc != odd); //executes anyway even when false
                {
                    return false;
                }
            }
            else {
                   System.out.println(calc != even);
                   if (calc != even); {
                      return false;
                }
            }
        }
        if (length == 0) return true;
        return isSnake(matrix, length - 1);
    }

    private static void putNumbers(int[][] matrix) {
        int n = 1;
        for (int i = 0; i < matrix.length; i++) {
            if (i % 2 == 0) {
                for (int j = 0; j < matrix[i].length; j++, n++) {
                    matrix[i][j] = n;
                }
            } else {
                for (int j = matrix[i].length - 1; j >= 0; j--, n++) {
                    matrix[i][j] = n;
                }
            }
        }

    }

    private static void printMatrix(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++)
            System.out.printf("%d\t", matrix[i][j]);
            System.out.println();
        }
        System.out.println();

    }

}

我有点理解管道,但不足以解决问题。非常感谢任何帮助/参考。

1 个答案:

答案 0 :(得分:0)

首先,由于两次连续的fork()调用,你在混合中有四个进程。这就是你拥有的

 child1 = fork();
 child2 = fork();

在第一个fork之后,您有两个进程,父进程和子进程。现在,当您执行第二个分支时,父级和子级将分别添加子进程。因此,此时您有四个进程处于活动状态。您可能希望将第二个fork移动到父进程(如果是子== 0))或子进程(if(child!= 0))。另一个需要解决的问题是在处理第一个输入之后您的子进程处理正在退出,所以在任何情况下都不会发生下一次处理。接下来你的管道需要适当设置以使其移动。

假设fd1,fd2和fd3是对,这里是你应该做的事情的草图(不完整的代码,只是为了传达图片)

    child1 = fork();
    if(child1 == 0) {
            // 1st child
            // .. code to close fds accordingly
            while (1) {
                    read(fd1[0],&value,sizeof(value));
                    printf("Child1(%d) received value: %d\n", getpid(), value);
                    value = value * value;
                    write(fd2[1],&value,sizeof(value));
            }
            exit(0);
    } else {
            child2 = fork();
            if(child2 == 0) {
                    // 2nd child process
                    // .. code to close fds accordingly
                    while (1) {
                            read(fd2[0],&value,sizeof(value));
                            printf("Child2(%d) received value: %d\n", getpid(), value);
                            value++;
                            write(fd3[1],&value,sizeof(value));
                    }
                    exit(0);
            }
            // Parent process
            // .. code to close fds accordingly
            while((scanf("%d", &value)) != EOF)
            {
                    write(fd1[1],&value, sizeof(value));
                    printf("Parent(%d) sent value: %d\n", getpid(), value);
                    read(fd3[0],&value,sizeof(value));
                    printf("New Value: %d\n",value);
            }

    }