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 代码的检查。这通常有助于...
我正在尝试使用 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 代码的检查。这通常有助于...