while循环中的Scanf无法输入任何内容

while循环中的Scanf无法输入任何内容,c,linux,C,Linux,我使用的是Linux2.0.26虚拟机,从来没有遇到过这个问题 while循环之所以有效,是因为我在其中添加了printf来测试它 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void main() { int i; mknod("pipe.txt", S

我使用的是Linux2.0.26虚拟机,从来没有遇到过这个问题

while循环之所以有效,是因为我在其中添加了printf来测试它

#include <stdio.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void main()
{
    int i;

    mknod("pipe.txt", S_IFIFO | 0666, 0);
    for (i = 0; i < 2; i++) {
        if (fork() == 0) {
            if (i == 0)
                to_pipe();
            //else
            //    pipe_a_archivo();
        }
    }
    wait(NULL);
    unlink("pipe.txt");
}

void to_pipe()
{
    int num, fdini;

    fdini = open("pipe.txt", O_WRONLY);
    do {
        //printf("Test");
        scanf("%d", &num);
        write(fdini, &num, sizeof(int));
    } while (num != 0);

    close(fdini);
    unlink("pipe.txt");
    exit();
}
#包括
#包括
#包括
#包括
#包括
void main()
{
int i;
mknod(“pipe.txt”,S|u IFIFFO | 0666,0);
对于(i=0;i<2;i++){
如果(fork()==0){
如果(i==0)
到_管道();
//否则
//管架;
}
}
等待(空);
取消链接(“pipe.txt”);
}
空到_管道()
{
intnum,fdini;
fdini=open(“pipe.txt”,仅限O_wr);
做{
//printf(“测试”);
scanf(“%d”和&num);
写入(fdini,&num,sizeof(int));
}而(num!=0);
关闭(fdini);
取消链接(“pipe.txt”);
退出();
}

这个程序应该从键盘上获取数字并将其写入文件中。我的问题是,每当我从命令行执行程序时,都不会发生任何事情,
scanf()
不起作用,因为它不允许我输入任何数字。我确信循环可以工作,因为如果取消注释
printf()
,它会在屏幕上打印。解决这个问题有什么帮助吗?

我认为您的问题主要是因为您没有实现
pipe\u a\u archivo()
函数来读取FIFO并将数据写入文件。当然,问题中的代码不是一个好的MCVE()。在其他问题中,循环的第二次迭代没有动作

此代码错误检查函数调用,并包括
pipe\u a\u archivo()
的合理实现,然后合理工作:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

static void to_pipe(void);
static void pipe_a_archivo(void);

#define FIFO_NAME "pipe.txt"
#define FILE_NAME "archive.txt"

int main(void)
{
    if (mkfifo(FIFO_NAME, 0666) != 0)
    {
        fprintf(stderr, "failed to create FIFO '%s'\n", FIFO_NAME);
        exit(EXIT_FAILURE);
    }
    if (fork() == 0)
        to_pipe();
    if (fork() == 0)
        pipe_a_archivo();
    int corpse;
    int status;
    while ((corpse = wait(&status)) > 0)
        printf("PID %d exited with status 0x%.4X\n", corpse, status);
    unlink("pipe.txt");
}

static void to_pipe(void)
{
    int num, fdini;

    fdini = open(FIFO_NAME, O_WRONLY);
    do
    {
        printf("Enter a number: ");
        fflush(stdout);
        scanf("%d", &num);
        write(fdini, &num, sizeof(int));
    } while (num != 0);

    close(fdini);
    exit(0);
}

static void pipe_a_archivo(void)
{
    int fd_in = open(FIFO_NAME, O_RDONLY);
    if (fd_in < 0)
    {
        fprintf(stderr, "Failed to open FIFO '%s' for reading\n", FIFO_NAME);
        exit(EXIT_FAILURE);
    }

    FILE *fp_out = fopen(FILE_NAME, "w");
    if (fp_out == NULL)
    {
        fprintf(stderr, "Failed to open file '%s' for writing\n", FILE_NAME);
        exit(EXIT_FAILURE);
    }

    int num;
    while (read(fd_in, &num, sizeof(num)) == sizeof(num))
    {
        fprintf(fp_out, "%d\n", num);
    }

    close(fd_in);
    fclose(fp_out);
    exit(0);
}

检查您使用的每个库函数的返回值。查看每个库函数手册页,阅读它返回的内容和原因,然后检查函数是否按预期运行。在
open()
的情况下,它返回值-1表示错误,您的代码不会编译。例如缺少
int num,fdini
中,由于重点在
scanf
上,您可以在不使用
printf
以外的任何其他函数的情况下使其工作吗?
void main()
main
的无效签名。它应该是
intmain(void)
。2)
void to_pipe()
应该是
void to_pipe(void)
。3) 如果您想让其他人阅读,请缩进您的代码并将其格式化为最好的格式。4) 正如Nellie所说,这段代码甚至不编译。缺少
(已解决;))。编译您在此发布的所有代码。最好使用高级别的警告标志,例如
gcc-std=c17-pedantic-Wall-Wextra-Werror
,以便您自己看到明显的错误。只有当你知道你在做什么的时候才能禁用它们。
$ ./fifo29
Enter a number: 23
Enter a number: 34
Enter a number: 12931344
Enter a number: 0
PID 10939 exited with status 0x0000
PID 10940 exited with status 0x0000
$ cat archive.txt
23
34
12931344
0
$