C 当我从文件中读取时,它从管道中读取

C 当我从文件中读取时,它从管道中读取,c,file,pipe,C,File,Pipe,我是C的新手,我正在做一个Uni项目,我将在这里解释: 我有两个文件,pfc.c和transdurcers.c,有三个进程,一个是transudcers,另外两个都是pfc 我必须让pfc通过两种不同的方式与transudercs通信: 一种方法是写入文件(pfc3)并从中读取传感器 一个来自使用管道(pfc2) 因此,一个进程用文件写入,另一个进程用管道写入,传感器必须同时读取它们 在这两种情况下,我只需每秒发送一个可变字符速度[10]的值; 所以我也有两个whiles,让每一件事每秒都写和读

我是C的新手,我正在做一个Uni项目,我将在这里解释:

我有两个文件,pfc.c和transdurcers.c,有三个进程,一个是transudcers,另外两个都是pfc

我必须让pfc通过两种不同的方式与transudercs通信:

一种方法是写入文件(pfc3)并从中读取传感器

一个来自使用管道(pfc2)

因此,一个进程用文件写入,另一个进程用管道写入,传感器必须同时读取它们 在这两种情况下,我只需每秒发送一个可变字符速度[10]的值; 所以我也有两个whiles,让每一件事每秒都写和读

但是有一个大问题,我从文件中读取的值不是文件中的值,而是管道中的值,我已经调试了所有代码,对此我有100%的把握。 我不知道怎么可能,我错过了什么? 感谢您的帮助,以下是我的代码:

这就是我在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);
    }
}
这就是我在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不是从文件而是从管道读取。这是因为我试图让它们都写不同的值​​唯一的读数是管道的读数。