C 我能';我不明白为什么我的节目总是说得太低

C 我能';我不明白为什么我的节目总是说得太低,c,C,所以我一直在开发一个小程序,它生成一个文件,然后生成一个子进程,在该文件中生成一个随机数,然后让我的父进程读取该数字,然后玩一个简单的高或低的游戏。每当我运行这个,无论我输入什么数字,它总是说太低。错误在哪里 int main() { int fd, m; if (mkfifo("myfifo", 0666) < 0) perror("mkfifo"), exit(EXIT_FAILURE); if (fork() == 0) {

所以我一直在开发一个小程序,它生成一个文件,然后生成一个子进程,在该文件中生成一个随机数,然后让我的父进程读取该数字,然后玩一个简单的高或低的游戏。每当我运行这个,无论我输入什么数字,它总是说太低。错误在哪里

int main()
{
int fd, m;

    if (mkfifo("myfifo", 0666) < 0)
            perror("mkfifo"), exit(EXIT_FAILURE);

    if (fork() == 0)
    {
            fd = open("myfifo", O_WRONLY);
            srand(time(NULL));
            int n = rand() % 100 + 1;
            close(fd);
            exit(EXIT_SUCCESS);
    }

    fd = open("myfifo", O_RDONLY);
    read(fd, &m, sizeof(int));
    int c = -1;
    while ( m != c )
    {
            if ( c == -1)
                    printf("Guess a number 1-100\n");
            else if (c > m)
                    printf("Too high!\n");
            else if (c < m)
                    printf("Too low!\n");

            printf("Enter your guess: ");
            scanf ("%d",&c);
    }
    printf("Winner! Yes, the answer was %d \n",m);
    close(fd);
    wait(NULL);
    unlink("myfifo");
    exit(EXIT_SUCCESS);
}
intmain()
{
int-fd,m;
如果(mkfifo(“myfifo”,0666)<0)
perror(“mkfifo”),退出(退出失败);
如果(fork()==0)
{
fd=打开(“myfifo”,仅限O_wr);
srand(时间(空));
int n=rand()%100+1;
关闭(fd);
退出(退出成功);
}
fd=打开(“myfifo”,仅限Ordu);
读取(fd、m、sizeof(int));
int c=-1;
while(m!=c)
{
如果(c==-1)
printf(“猜一个数字1-100\n”);
如果(c>m),则为else
printf(“太高!\n”);
else if(c
您的子进程从不写入fifo。它只是打开它,生成一个随机数,然后关闭它。尝试编写

// inside fork() == 0 block
write(fd, &n, sizeof(n));

除了@Brian Tracy所说的之外,您还应该让父进程等待子进程完成对文件的写入,然后再由父进程读取。

您是否在调试器中运行它并跟踪
c
m
的值?祝你好运。更好的代码会在使用
m
之前检查
read(fd,&m,sizeof(int))的返回值。非常感谢!!我太专注于思考我的阅读是不对的,甚至没有想到这一点。下次我必须更加注意。
read
系统调用阻塞,因此我认为父进程只会等待子进程将数据放入管道。但是,假设子进程将先于父进程,这难道不正确吗?如果文件为空,那么父级不读取空白文件吗?我已经有一段时间没有接触c了,所以我可能对
read
的工作方式有错误。