C-从父母到子女过程的管道无效



对于我的作业,我需要制作一个带有四个选项的菜单(添加节点,列表节点,删除节点和退出(,当用户选择这四个选项之一(带有分别为1、2、3或4(,儿童过程处理选择。我还没有实施2或3的选项,因此不必担心这两个。这是我的代码,因此您可以了解布局:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
int main()
{
    int p[2];
    char option[10];
    int node_num = 1;
    int rd, wr, tail = 0;
    pid_t first_fork;
    first_fork = fork();
    pipe(p);
    if (first_fork > 0)
    {
        // root
        do
        {
            printf("NODES MENUn");
            printf("    1) ADD NODEn");
            printf("    2) LIST NODESn");
            printf("    3) REMOVE NODEn");
            printf("    4) QUITn");
            printf("SELECT AN OPTION: ");
            fgets(option, 10, stdin);
            write(p[1], option, 1);
            if (option[0] != '1' && option[0] != '2' && option[0] != '3' && option[0] != '4')
            {
                printf("[Invalid Selection]n");
            }
        } while (option[0] != '4');
    }
    else
    {
        // first node
        read(p[0], option, 1);
        if (option[0] == 1 && tail == 1)
        {
            int p2[2];
            node_num++;
            pipe(p2);
            pid_t cpid;
            cpid = fork();
            if (cpid > 0)
            {
                // parent
                tail = 0;
                wr = p2[1];
            }
            else
            {
                // child
                printf("[Node:  %d PID:     %d  HAS BEEN ADDED...]n", node_num, getpid());
                tail = 1;
                rd = p2[0];
            }
        }
        if (option[0] == '2')
        {
            int i;
            for (i = 0; i < node_num; i++)
            {
                printf("[Node: %d   PID: %d     PPID: %d    RD: %d  WR: %dn", node_num, getpid(), getppid(), rd, wr);
            }
        }
        if (option[0] == '3')
        {
            printf("remove");
        }
    }
}

截至目前,我的主要关注点是增加添加选项以正常工作。fgets函数获取用户选项后,父进程应使用write()read()写入第一个"节点"(子进程(。然后,在子进程的内部,应相应地处理选项(选项4除外,该选项由do-while循环处理(。

菜单效果完美;无效的选择部分以及戒烟的选项4。但是,当我选择选项1时,什么都不会打印,菜单再次弹出(就像应该的那样,直到我选择选项4(。选项2和3也出现了同样的问题。

这是输出的同样:

NODES MENU
    1) ADD NODE
    2) LIST NODES
    3) REMOVE NODE
    4) QUIT
SELECT AN OPTION: 1
NODES MENU
    1) ADD NODE
    2) LIST NODES
    3) REMOVE NODE
    4) QUIT
SELECT AN OPTION: 4

孩子的过程没有像应该打印任何东西。

我尝试将第一个孩子的 else更改为另一个if form

的语句
if (first_fork == 0)

但是什么也没有发生。实际上,昨天我尝试了同样的事情,至少我能够打印出添加了节点。但是现在什么都没有印刷,我不知道我以前更改了它的工作,但现在没有。

我尝试使用close()函数通过关闭子女(在read()之前(和关闭父(write()之前(关闭p[0]的P [1]来将数据从父母发送到子女。这无能为力。

我想在写给孩子后可能需要使用wait(NULL)功能调用,但这阻止了菜单弹出(也许我只是在使用wait函数错误?(。

我尝试摆脱&& tail == 1检查;那也没有做任何事情。

所以我唯一的猜测是它与do-do-lile循环有关,并且/或管道不正确编写和阅读,和/或if statement not statement not statement不正确读取字符。

您的两个最大错误是:

  • 您在创建管道之前就分叉了。

    这意味着父母和孩子无法交流,因为他们拥有自己的管道而不是共享管道。您应该在分叉之前创建管道。

  • 儿童过程没有循环。

    孩子只从管道上读书一次。它应该是从管道中读取的循环,直到收到父母杀死自己的消息。

最新更新