C 当我从文件中读取时,它从管道中读取
我是C的新手,我正在做一个Uni项目,我将在这里解释: 我有两个文件,pfc.c和transdurcers.c,有三个进程,一个是transudcers,另外两个都是pfc 我必须让pfc通过两种不同的方式与transudercs通信: 一种方法是写入文件(pfc3)并从中读取传感器 一个来自使用管道(pfc2) 因此,一个进程用文件写入,另一个进程用管道写入,传感器必须同时读取它们 在这两种情况下,我只需每秒发送一个可变字符速度[10]的值; 所以我也有两个whiles,让每一件事每秒都写和读 但是有一个大问题,我从文件中读取的值不是文件中的值,而是管道中的值,我已经调试了所有代码,对此我有100%的把握。 我不知道怎么可能,我错过了什么? 感谢您的帮助,以下是我的代码: 这就是我在pfc中创建管道和文件的方式C 当我从文件中读取时,它从管道中读取,c,file,pipe,C,File,Pipe,我是C的新手,我正在做一个Uni项目,我将在这里解释: 我有两个文件,pfc.c和transdurcers.c,有三个进程,一个是transudcers,另外两个都是pfc 我必须让pfc通过两种不同的方式与transudercs通信: 一种方法是写入文件(pfc3)并从中读取传感器 一个来自使用管道(pfc2) 因此,一个进程用文件写入,另一个进程用管道写入,传感器必须同时读取它们 在这两种情况下,我只需每秒发送一个可变字符速度[10]的值; 所以我也有两个whiles,让每一件事每秒都写和读
void pfc2()
{
createPipe();
readCoordinates();
if(pipeFd != -1)
{
write(pipeFd,f_end,sizeof(f_end));
close(pipeFd);
unlink("../tmp/PipePFC2");
}
}
void pfc3()
{
createFile();
readCoordinates();
FILE * fileTransudcers = fopen("../tmp/PFC3Transducers.txt", "w");
if(fileTransudcers != NULL)
{
fputs(f_end,fileTransudcers);
}
fclose(fileTransudcers);
}
void createFile()
{
FILE * fileTransudcers = fopen("../tmp/PFC3Transducers.txt", "w");
if(fileTransudcers != NULL)
{
fclose(fileTransudcers);
}
}
void createPipe()
{
unlink("../tmp/PipePFC2");
mkfifo("../tmp/PipePFC2",0666);
pipeFd = open("../tmp/PipePFC2",O_WRONLY);
}
void writePFC3()
{
FILE * fileTransudcers = fopen("../tmp/PFC3Transducers.txt", "w");
int fd_fpTransducers = fileno(fileTransudcers);
if(fileTransudcers != NULL)
{
fputs(speed,fileTransudcers);
printf("SpeedPFC3: %s\n",speed);
}
if(fileTransudcers != NULL)
{
fclose(fileTransudcers);
}
}
void writePFC2()
{
if(pipeFd != -1)
{
write(pipeFd,speed,sizeof(speed));
printf("SpeedPFC2: %s\n",speed);
}
}
这就是我在pfc中的写作方式
void pfc2()
{
createPipe();
readCoordinates();
if(pipeFd != -1)
{
write(pipeFd,f_end,sizeof(f_end));
close(pipeFd);
unlink("../tmp/PipePFC2");
}
}
void pfc3()
{
createFile();
readCoordinates();
FILE * fileTransudcers = fopen("../tmp/PFC3Transducers.txt", "w");
if(fileTransudcers != NULL)
{
fputs(f_end,fileTransudcers);
}
fclose(fileTransudcers);
}
void createFile()
{
FILE * fileTransudcers = fopen("../tmp/PFC3Transducers.txt", "w");
if(fileTransudcers != NULL)
{
fclose(fileTransudcers);
}
}
void createPipe()
{
unlink("../tmp/PipePFC2");
mkfifo("../tmp/PipePFC2",0666);
pipeFd = open("../tmp/PipePFC2",O_WRONLY);
}
void writePFC3()
{
FILE * fileTransudcers = fopen("../tmp/PFC3Transducers.txt", "w");
int fd_fpTransducers = fileno(fileTransudcers);
if(fileTransudcers != NULL)
{
fputs(speed,fileTransudcers);
printf("SpeedPFC3: %s\n",speed);
}
if(fileTransudcers != NULL)
{
fclose(fileTransudcers);
}
}
void writePFC2()
{
if(pipeFd != -1)
{
write(pipeFd,speed,sizeof(speed));
printf("SpeedPFC2: %s\n",speed);
}
}
这就是我在传感器中打开文件和管道的方式
void openTransducerFile()
{
do
{
fileTransducers = fopen("../tmp/PFC3Transducers.txt", "r");
} while (fileTransducers == NULL);
}
void openPipe()
{
do
{
pipeFd = open("../tmp/PipePFC2",O_RDONLY);
}
while(pipeFd == -1);
}
void readSpeedPFC2()
{
if(pipeFd != -1)
{
char line2[10];
read(pipeFd,line2,10);
speedPFC2 = line2;
}
else
{
printf("Impossibile ricevere PFC2.");
}
}
void readSpeedPFC3()
{
if(fileTransducers != NULL)
{
char line3[10];
fgets(line3,10,fileTransducers);
speedPFC3 = line3;
}
else
{
printf("Impossibile ricevere PFC3.");
}
}
这是我在传感器中读取文件和管道的方式
void openTransducerFile()
{
do
{
fileTransducers = fopen("../tmp/PFC3Transducers.txt", "r");
} while (fileTransducers == NULL);
}
void openPipe()
{
do
{
pipeFd = open("../tmp/PipePFC2",O_RDONLY);
}
while(pipeFd == -1);
}
void readSpeedPFC2()
{
if(pipeFd != -1)
{
char line2[10];
read(pipeFd,line2,10);
speedPFC2 = line2;
}
else
{
printf("Impossibile ricevere PFC2.");
}
}
void readSpeedPFC3()
{
if(fileTransducers != NULL)
{
char line3[10];
fgets(line3,10,fileTransducers);
speedPFC3 = line3;
}
else
{
printf("Impossibile ricevere PFC3.");
}
}
我认为你应该包括你的全部代码。特别是,我想知道您在调用
readSpeedPFC3
后是否正在尝试阅读speedPFC3
。您可能需要使用strcpy
/memcpy
而不是speedPFC3=line3
因为您没有检查read返回的值,所以无法“100%确定”任何事情。@KrenarHoxha您知道局部变量吗?局部变量的生存期是多少?它什么时候被创建,什么时候被销毁?如果你使用一个指针指向一个被破坏的变量,会发生什么?@EdmCoff我没有包括它,因为我认为它是usless,因为这个问题还有其他外部因素。但如果能帮上忙的话,我可以把它寄出去。我还将尝试strcpy,看看它是否works@WilliamPursell显然,我没有发布我所做的所有各种printf,但我可以向您保证,我已经尝试在任何地方打印,我确信fgets不是从文件而是从管道读取。这是因为我试图让它们都写不同的值唯一的读数是管道的读数。