Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
管道C上的多维数组 我有一个结构,看起来像这样: struct result { int personId; int questionId; int choice; };_C_Arrays_Multidimensional Array_Pipe - Fatal编程技术网

管道C上的多维数组 我有一个结构,看起来像这样: struct result { int personId; int questionId; int choice; };

管道C上的多维数组 我有一个结构,看起来像这样: struct result { int personId; int questionId; int choice; };,c,arrays,multidimensional-array,pipe,C,Arrays,Multidimensional Array,Pipe,我正试图在父母和孩子之间建立一种双向交流。 我有一个数组: 我通过管道一行一行地发送这个2D数组,如下所示,从子部分开始: write(p2[1], &finalResults[0], sizeof(finalResults[0])); write(p2[1], &finalResults[1], sizeof(finalResults[1])); write(p2[1], &finalResults[2], sizeof(finalResults[2])); 然后我试

我正试图在父母和孩子之间建立一种双向交流。 我有一个数组:

我通过管道一行一行地发送这个2D数组,如下所示,从子部分开始:

write(p2[1], &finalResults[0], sizeof(finalResults[0]));
write(p2[1], &finalResults[1], sizeof(finalResults[1]));
write(p2[1], &finalResults[2], sizeof(finalResults[2]));
然后我试着从家长的角度来看:

    while ((n = read(p2[0], resultBuffer, sizeof(resultBuffer)) > 0)) {
           int i = 0;
           for (i = 0; i < 20; ++i) {
           if (resultBuffer[i].choice != 0)
              printf("Result for question id: %d, person id: %d, choice: %d\n", resultBuffer[i].questionId, resultBuffer[i].personId, resultBuffer[i].choice);
}
一切进展顺利,但是父级只读取2D数组的第一行,而不读取其余的行。 有什么问题吗?
谢谢。

您没有注意到父级读取的字节数,并且可能没有足够快地关闭管道的写入端。下面是代码的一个次要变体,修复了这些问题:

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

struct result {
    int personId;
    int questionId;
    int choice;
};

int main(void)
{
    int p2[2];

    pipe(p2);

    if (fork() == 0)
    {
        close(p2[0]);
        struct result finalResults[3][20];
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                finalResults[i][j].personId = rand() % 36 + 100;
                finalResults[i][j].questionId = rand() % 20 + 1;
                finalResults[i][j].choice = rand() % 5 + 1;
            }
        }

        printf("Child:\n");
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                printf("(%d,%2d,%d)", finalResults[i][j].personId,
                       finalResults[i][j].questionId, finalResults[i][j].choice);
                if (j % 5 == 4)
                    putchar('\n');
            }
        }

        write(p2[1], &finalResults[0], sizeof(finalResults[0]));
        write(p2[1], &finalResults[1], sizeof(finalResults[1]));
        write(p2[1], &finalResults[2], sizeof(finalResults[2]));

        close(p2[1]);
    }
    else
    {
        struct result resultBuffer[1024];
        int n;
        close(p2[1]);
        while ((n = read(p2[0], resultBuffer, sizeof(resultBuffer))) > 0) {
            int n_entries = n / sizeof(resultBuffer[0]);
            printf("Read: %d entries\n", n_entries);
            for (int i = 0; i < n_entries; ++i) {
                if (resultBuffer[i].choice != 0)
                    printf("Result for question id: %2d, person id: %d, choice: %d\n",
                           resultBuffer[i].questionId, resultBuffer[i].personId,
                           resultBuffer[i].choice);
            }
        }
        close(p2[0]);
    }
    return 0;
}
请注意,没有对srand的调用,因此每次的输出都是相同的。您可以用多种方式排列不同的种子

样本输出:

Child:
(131,10,4)(102,11,3)(124,19,4)(101, 1,1)(124, 3,3)
(111, 8,5)(116,13,4)(101,10,3)(104,14,5)(118,17,1)
(125, 7,3)(119,11,4)(119,10,5)(121, 8,3)(101,17,1)
(129, 9,2)(106,18,2)(129, 9,5)(128,11,5)(108,11,4)
(134, 7,5)(108, 2,4)(109, 9,4)(125,19,2)(107,14,1)
(122, 4,2)(105,10,1)(134,10,2)(129,16,1)(108,12,4)
(112, 4,1)(134,13,2)(116,18,4)(100, 2,3)(111, 9,3)
(126,18,3)(130, 5,5)(111, 6,1)(103,19,3)(107, 9,3)
(100,18,5)(128,16,4)(105,11,2)(106, 3,1)(122,13,3)
(109,16,3)(115, 2,1)(115,19,3)(128,11,1)(131,16,2)
(108,19,1)(103,15,4)(125, 1,1)(106, 4,2)(129,11,4)
(110, 1,5)(134,15,2)(106, 4,4)(128,11,1)(127, 4,3)
Read: 60 entries
Result for question id: 10, person id: 131, choice: 4
Result for question id: 11, person id: 102, choice: 3
Result for question id: 19, person id: 124, choice: 4
Result for question id:  1, person id: 101, choice: 1
Result for question id:  3, person id: 124, choice: 3
Result for question id:  8, person id: 111, choice: 5
Result for question id: 13, person id: 116, choice: 4
Result for question id: 10, person id: 101, choice: 3
Result for question id: 14, person id: 104, choice: 5
Result for question id: 17, person id: 118, choice: 1
Result for question id:  7, person id: 125, choice: 3
Result for question id: 11, person id: 119, choice: 4
Result for question id: 10, person id: 119, choice: 5
Result for question id:  8, person id: 121, choice: 3
Result for question id: 17, person id: 101, choice: 1
Result for question id:  9, person id: 129, choice: 2
Result for question id: 18, person id: 106, choice: 2
Result for question id:  9, person id: 129, choice: 5
Result for question id: 11, person id: 128, choice: 5
Result for question id: 11, person id: 108, choice: 4
Result for question id:  7, person id: 134, choice: 5
Result for question id:  2, person id: 108, choice: 4
Result for question id:  9, person id: 109, choice: 4
Result for question id: 19, person id: 125, choice: 2
Result for question id: 14, person id: 107, choice: 1
Result for question id:  4, person id: 122, choice: 2
Result for question id: 10, person id: 105, choice: 1
Result for question id: 10, person id: 134, choice: 2
Result for question id: 16, person id: 129, choice: 1
Result for question id: 12, person id: 108, choice: 4
Result for question id:  4, person id: 112, choice: 1
Result for question id: 13, person id: 134, choice: 2
Result for question id: 18, person id: 116, choice: 4
Result for question id:  2, person id: 100, choice: 3
Result for question id:  9, person id: 111, choice: 3
Result for question id: 18, person id: 126, choice: 3
Result for question id:  5, person id: 130, choice: 5
Result for question id:  6, person id: 111, choice: 1
Result for question id: 19, person id: 103, choice: 3
Result for question id:  9, person id: 107, choice: 3
Result for question id: 18, person id: 100, choice: 5
Result for question id: 16, person id: 128, choice: 4
Result for question id: 11, person id: 105, choice: 2
Result for question id:  3, person id: 106, choice: 1
Result for question id: 13, person id: 122, choice: 3
Result for question id: 16, person id: 109, choice: 3
Result for question id:  2, person id: 115, choice: 1
Result for question id: 19, person id: 115, choice: 3
Result for question id: 11, person id: 128, choice: 1
Result for question id: 16, person id: 131, choice: 2
Result for question id: 19, person id: 108, choice: 1
Result for question id: 15, person id: 103, choice: 4
Result for question id:  1, person id: 125, choice: 1
Result for question id:  4, person id: 106, choice: 2
Result for question id: 11, person id: 129, choice: 4
Result for question id:  1, person id: 110, choice: 5
Result for question id: 15, person id: 134, choice: 2
Result for question id:  4, person id: 106, choice: 4
Result for question id: 11, person id: 128, choice: 1
Result for question id:  4, person id: 127, choice: 3

我认为,在写入缓冲区后,在dup命令之后,您没有关闭文件描述符或文件描述符表上的缓冲区,如果您没有关闭,PROCES不理解在关闭file descriptior from TABLE之前,PROCES已完成或继续将输入写入bufer。当客户端写入第一行时,是否仅输入一次读入值的父代码,当客户端写入其他行时,不再输入此代码?@FatihAltuntaş我在写入后立即关闭它,如:closep1[0];closep2[1]@Stephatechner没有,因为我有等待状态;在父代码中,它等待子代码完成。n的值是多少?读取可能会一次消耗所有行,但在循环中只能访问20个元素。。。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

struct result {
    int personId;
    int questionId;
    int choice;
};

int main(void)
{
    int p2[2];

    pipe(p2);

    if (fork() == 0)
    {
        close(p2[0]);
        struct result finalResults[3][20];
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                finalResults[i][j].personId = rand() % 36 + 100;
                finalResults[i][j].questionId = rand() % 20 + 1;
                finalResults[i][j].choice = rand() % 5 + 1;
            }
        }

        printf("Child:\n");
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                printf("(%d,%2d,%d)", finalResults[i][j].personId,
                       finalResults[i][j].questionId, finalResults[i][j].choice);
                if (j % 5 == 4)
                    putchar('\n');
            }
        }

        write(p2[1], &finalResults[0], sizeof(finalResults[0]));
        write(p2[1], &finalResults[1], sizeof(finalResults[1]));
        write(p2[1], &finalResults[2], sizeof(finalResults[2]));

        close(p2[1]);
    }
    else
    {
        struct result resultBuffer[1024];
        int n;
        close(p2[1]);
        while ((n = read(p2[0], resultBuffer, sizeof(resultBuffer))) > 0) {
            int n_entries = n / sizeof(resultBuffer[0]);
            printf("Read: %d entries\n", n_entries);
            for (int i = 0; i < n_entries; ++i) {
                if (resultBuffer[i].choice != 0)
                    printf("Result for question id: %2d, person id: %d, choice: %d\n",
                           resultBuffer[i].questionId, resultBuffer[i].personId,
                           resultBuffer[i].choice);
            }
        }
        close(p2[0]);
    }
    return 0;
}
write(p2[1], finalResults, sizeof(finalResults));
Child:
(131,10,4)(102,11,3)(124,19,4)(101, 1,1)(124, 3,3)
(111, 8,5)(116,13,4)(101,10,3)(104,14,5)(118,17,1)
(125, 7,3)(119,11,4)(119,10,5)(121, 8,3)(101,17,1)
(129, 9,2)(106,18,2)(129, 9,5)(128,11,5)(108,11,4)
(134, 7,5)(108, 2,4)(109, 9,4)(125,19,2)(107,14,1)
(122, 4,2)(105,10,1)(134,10,2)(129,16,1)(108,12,4)
(112, 4,1)(134,13,2)(116,18,4)(100, 2,3)(111, 9,3)
(126,18,3)(130, 5,5)(111, 6,1)(103,19,3)(107, 9,3)
(100,18,5)(128,16,4)(105,11,2)(106, 3,1)(122,13,3)
(109,16,3)(115, 2,1)(115,19,3)(128,11,1)(131,16,2)
(108,19,1)(103,15,4)(125, 1,1)(106, 4,2)(129,11,4)
(110, 1,5)(134,15,2)(106, 4,4)(128,11,1)(127, 4,3)
Read: 60 entries
Result for question id: 10, person id: 131, choice: 4
Result for question id: 11, person id: 102, choice: 3
Result for question id: 19, person id: 124, choice: 4
Result for question id:  1, person id: 101, choice: 1
Result for question id:  3, person id: 124, choice: 3
Result for question id:  8, person id: 111, choice: 5
Result for question id: 13, person id: 116, choice: 4
Result for question id: 10, person id: 101, choice: 3
Result for question id: 14, person id: 104, choice: 5
Result for question id: 17, person id: 118, choice: 1
Result for question id:  7, person id: 125, choice: 3
Result for question id: 11, person id: 119, choice: 4
Result for question id: 10, person id: 119, choice: 5
Result for question id:  8, person id: 121, choice: 3
Result for question id: 17, person id: 101, choice: 1
Result for question id:  9, person id: 129, choice: 2
Result for question id: 18, person id: 106, choice: 2
Result for question id:  9, person id: 129, choice: 5
Result for question id: 11, person id: 128, choice: 5
Result for question id: 11, person id: 108, choice: 4
Result for question id:  7, person id: 134, choice: 5
Result for question id:  2, person id: 108, choice: 4
Result for question id:  9, person id: 109, choice: 4
Result for question id: 19, person id: 125, choice: 2
Result for question id: 14, person id: 107, choice: 1
Result for question id:  4, person id: 122, choice: 2
Result for question id: 10, person id: 105, choice: 1
Result for question id: 10, person id: 134, choice: 2
Result for question id: 16, person id: 129, choice: 1
Result for question id: 12, person id: 108, choice: 4
Result for question id:  4, person id: 112, choice: 1
Result for question id: 13, person id: 134, choice: 2
Result for question id: 18, person id: 116, choice: 4
Result for question id:  2, person id: 100, choice: 3
Result for question id:  9, person id: 111, choice: 3
Result for question id: 18, person id: 126, choice: 3
Result for question id:  5, person id: 130, choice: 5
Result for question id:  6, person id: 111, choice: 1
Result for question id: 19, person id: 103, choice: 3
Result for question id:  9, person id: 107, choice: 3
Result for question id: 18, person id: 100, choice: 5
Result for question id: 16, person id: 128, choice: 4
Result for question id: 11, person id: 105, choice: 2
Result for question id:  3, person id: 106, choice: 1
Result for question id: 13, person id: 122, choice: 3
Result for question id: 16, person id: 109, choice: 3
Result for question id:  2, person id: 115, choice: 1
Result for question id: 19, person id: 115, choice: 3
Result for question id: 11, person id: 128, choice: 1
Result for question id: 16, person id: 131, choice: 2
Result for question id: 19, person id: 108, choice: 1
Result for question id: 15, person id: 103, choice: 4
Result for question id:  1, person id: 125, choice: 1
Result for question id:  4, person id: 106, choice: 2
Result for question id: 11, person id: 129, choice: 4
Result for question id:  1, person id: 110, choice: 5
Result for question id: 15, person id: 134, choice: 2
Result for question id:  4, person id: 106, choice: 4
Result for question id: 11, person id: 128, choice: 1
Result for question id:  4, person id: 127, choice: 3