来自父进程的C管道不良值

时间:2018-11-27 16:04:33

标签: c pipe fork

我有一个简单的程序,但是当我想检查从孩子那里得到的值时,它将返回1995694080或类似的数字。我有点困惑,如何获得味精的真实价值?好像我从我不应该从其他地方得到一些随机垃圾值。我根据教程制作了此管道发送器,并且大多数情况下,当我从失败的孩子发回数据时,它就可以正常工作。有任何想法或建议吗?

int pipefd[2];

int main()
{
    signal(SIGTERM, handler);
    signal(SIGUSR1, finishedOrder);
    pid_t pid;


    if (pipe(pipefd) == -1)
    {
        perror("Error while making pipe.\n");
        exit(1);
    }

    pid = fork();

    if (pid < 0)
    {
        perror("Fork error.\n");
        exit(1);
    }

    if (pid > 0)
    {
        employer(pid, 4, false);
    }
    else
    {
        employee(getppid());
    }
}

void employer(pid_t pid, int id, bool two)
{
    int rec;

    printf("[Szülő]: várok egy szerelő csapatra! \n");
    sleep(1);

    kill(pid, SIGTERM);

    pause();

    if (two)
    {
        /.../
    }
    else
    {
        printf("[Szülő]: dolgozz a %d. feladaton\n", id);
        close(pipefd[0]);
        write(pipefd[1], &id, sizeof(id)); //this is works.
        close(pipefd[1]);
        sleep(1);

        kill(pid, SIGTERM);

        pause();

        kill(pid, SIGTERM);
    }

    pause();

    close(pipefd[1]);
    read(pipefd[0], &rec, sizeof(rec));

    printf("%d\n", rec); // here I get the strange value

    if (rec == 4)
    {
        printf("[Szülő]: feljegyeztem a módosításokat.\n");
        if (two)
        {
            /**/
        }
        else
        {
            /**/
        }
    }

}

void employee(pid_t emp)
{
    int jobs[2];
    pause();

    printf("[Gyerek]: munkára jelentkezek\n");
    sleep(1);

    kill(emp, SIGTERM);

    pause();

    close(pipefd[1]);

    read(pipefd[0], &jobs[0], sizeof(jobs[0]));
    close(pipefd[0]);
    printf("[Gyerek]: elkezdek dolgozni a %d. feladaton.\n", jobs[0]);
    sleep(1);
    kill(emp, SIGUSR1);
    pause();

    sleep(1);
    read(pipefd[0], &jobs[1], sizeof(jobs[1]));


    if (jobs[1] != 0)
    {
        printf("[Gyerek]: elkezdek dolgozni a %d. feladaton.\n", jobs[1]);
        sleep(1);

        kill(emp, SIGUSR1);
    }

    close(pipefd[0]);
    fflush(NULL);
    int msg = 4;
    printf("%d\n", msg);
    write(pipefd[1], &msg, sizeof(msg));
    close(pipefd[1]);

    sleep(1);
    kill(emp, SIGTERM);
}

void handler(int signum)
{
}

void finishedOrder()
{
}

2 个答案:

答案 0 :(得分:4)

read(pipefd[0], &rec, sizeof(rec));

您无需检查read返回的值即可查看已收到多少数据。如果这样做了,您可能会发现这不是您期望的,因为在代码的前面您已经做到了……

    close(pipefd[0]);

关闭文件描述符后,您将无法读取它。更重要的是,您创建的“管道”不是双向的。如果要发送和接收,则需要对pipe进行两次调用以获取两对文件描述符。

鉴于您还close(pipefd[1])之前做过read,这意味着您已经封闭了管道的两端,这似乎是您误解了close的目的在这种情况下。子项close和父项keras.activations.softmax不在使用中,仅此而已。它并不表示有关谁正在读取或写入管道的任何信息。

答案 1 :(得分:1)

在您的print(' , '.join(x)) print(*x) output: jasmine, amine jasmine amine 函数中,您使用employer()关闭管道的读取端,然后稍后尝试使用close(pipefd[0]);对其进行读取

试图从封闭的fd中读取可能会导致产生奇怪的值。会像Johnathan Leffler所说的那样做。

rustyx在注释中是正确的-检查read(pipefd[0], &rec, sizeof(rec));的返回值是个好主意,因为它会发现这种错误。