Scanf 正在读取命名管道程序上的 ctrl+c

Scanf is reading ctrl+c on named-pipes program

我正在尝试使用 2 C 程序(读写)制作命名管道或 FIFO。这两个程序都是 运行 的 while(1) 循环。 这些程序应该在按下 ctrl+c 时终止,但是当我在 write 程序上按下 ctrl+c 时,它仍然向 read[=30= 发送一些东西] 程序。如果我输入正常数字,它工作正常,但是当我在 write 程序上按 ctrl+c 终止时,它将这个随机数提供给 read 节目

#normal numbers shows:
BMI: 16.1, Overweight

#on ctrl+c input:
BMI = 165534.6 (some random numbers)

这是编写程序的代码

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

int main()
{
    int fd, fd1, fd2;
    
    //FIFO file path
    char * myfifo = "/tmp/myfifo";

    mkfifo(myfifo,0666);

    float weight, height, bmi = 0;
    char arr1[80];
    while(1)
    {
        //open
        fd = open(myfifo, O_WRONLY);
        fd1 = open(myfifo, O_WRONLY);
        fd2 = open(myfifo, O_WRONLY);

        printf("Name            : ");
        scanf("%[^\n]", arr1);
        getchar();
        write(fd, arr1, strlen(arr1)+1);
        close(fd);
        
        printf("Body Weight in kg    : ");
        scanf("%f",  &weight);
        getchar();
        write(fd1, &weight, sizeof(weight));
        printf("%f\n", weight);
        close(fd1);

        printf("Body Height in cm    : ");
        scanf("%f",  &height);
        getchar();
        printf("\n---------------------------\n\n");
        write(fd2, &height, sizeof(height));
        printf("%f\n", height);
        close(fd2);

    }
    return 0;
}

这是 read 程序的代码,它会进行 while(1) 循环

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

int main()
{
    int fd, fd1, fd2;
    char * myfifo = "/tmp/myfifo";
    mkfifo(myfifo,0666);
    float weight, height, bmi = 0;
    char str1[80];
    while(1)
    {
        //First open in read only and read
        fd = open(myfifo, O_RDONLY);
        fd1 = open(myfifo, O_RDONLY);
        fd2 = open(myfifo, O_RDONLY);
        read(fd, str1, 80);
        read(fd1, &weight, sizeof(weight));
        read(fd2, &height, sizeof(height));
        
        height = (height / 100);
        
        bmi = weight / (height * height);

        //Print the read string and close
        printf("%s BMI : %.1f\n", str1, bmi);
        close(fd);
        close(fd1);
        close(fd2);

        if(bmi < 18.5)
        {
            printf("Details = Underweight\n");
        }
        else if(bmi >= 18.5 && bmi <= 22.9)
        {
            printf("Details = Normal\n");
        }
        else if(bmi >= 23.0 && bmi <= 24.9)
        {
            printf("Details = Overweight\n");
        }
        else if(bmi >= 25.0 && bmi <= 29.9)
        {
            printf("Details = Obese I (Obesitas Class I)\n");
        }
        else
        {
            printf("Details = Obese II (Obesitas Class II)\n");
        }

    }
    return 0;
}

所以,我想知道,有没有办法让 ctrl+c 终止这两个进程?这样 write 程序在按下 cttrl+c 后不会发送任何东西。我认为这个问题的发生是因为即使按下 ctrl+c,read 程序仍会从 write 读取一些输入。

是因为你没有检查reader中的read()可能return0。因此,当它 returns 0(= 读取 0 个字符)时,您会显示缓冲区中的所有垃圾。当read()returns为0时,应该终止reader,因为这意味着对方关闭了(writer退出)。

作为一般规则,尝试检查 services/syscalls 中的所有 return 代码。您可以在不检查任何内容的情况下制作初稿。但是当它出现功能障碍时,添加对 return 代码的检查。这通常有助于...