首页 > 解决方案 > Linux中C中2个不同应用程序之间的FIFO通信

问题描述

我一直在尝试编写一种机制,用于在 2 个不同的应用程序之间进行通信,一个称为服务器,另一个是客户端,我在 2 个终端中分别启动。我决定使用 FIFO 文件,我遇到的问题是我从 FIFO 中的客户端应用程序中写入了一些文本,当我尝试将这些数据从客户端传输到服务器时,服务器进程显然收到什么都没有,从而停止了一切。客户端应用

char comanda[256], optiuni[256], inutil[5];
char raspuns[512];
char * fisierFifoScriere = "/home/cosmin/Documents/theFifoFile1";
char * fisierFifoCitire = "/home/cosmin/Documents/theFifoFile2";
FILE * scriere;
FILE * citire;

int main(int argc, char * argv[]){
    //Aici initializam file descriptorii necesari
    scriere = fopen(fisierFifoScriere, "w");
    if(scriere == NULL){
        perror("Eroare la deschiderea fisierului: ");           
        return 1;
    }
    
    citire = fopen(fisierFifoCitire, "r");
    if(citire == NULL){
        perror("Eroare la deschiderea fisierului: ");
        return 1;
    }
    
    while(1){
    //Partea de citire de la utilizator si de trimitere a comenzii
        scanf("%s", comanda);
        if(strcmp(comanda, "login") == 0){
            scanf("%s %s", inutil, optiuni);
            fprintf(scriere, "%s %s", comanda, optiuni);
        }
        else if(strcmp(comanda, "get-proc-info") == 0){
            scanf("%s %s", inutil, optiuni);
            fprintf(scriere, "%s %s", comanda, optiuni);
        }
        else if(strcmp(comanda, "get-logged-users") == 0){
            fprintf(scriere, "%s", comanda);
        }
        else if(strcmp(comanda, "logout") == 0){
            fprintf(scriere, "%s", comanda);
        }
        else if(strcmp(comanda, "quit") == 0){
            fprintf(scriere, "%s", comanda);
        }
        else{
            printf("%s\n", "Command unkown. Please try again!");
        }
        //fflush(scriere);
    //Partea de primire a raspunsului de la server
        while(fgets(raspuns, sizeof(raspuns)+1, citire)){
            printf("%s\n", raspuns);
        }
    }
    return 0;
}

服务器应用程序

char comandaDeCitit[256];
char raspuns[256];
FILE * scriere; //scriere va fi file descriptorul pentru fifo ul folosit in trimiterea raspunsurilor catre client
FILE * citire;  //citire va fi file descriptorul pentru fifo ul folosit in citirea de la client
char * fisierFifoCitire = "/home/cosmin/Documents/theFifoFile1";
char * fisierFifoScriere = "/home/cosmin/Documents/theFifoFile2";

bool loggedUser = false;
char UserName[25];

pid_t pid;
int rv;

int main(){
    mkfifo(fisierFifoCitire, 0666);
    mkfifo(fisierFifoScriere, 0666);
    //Aici deschidem un descriptor de citire, pentru a putea obtine comanda de la client.
    citire = fopen(fisierFifoCitire, "r");
    if(citire == NULL){
            perror("Eroare la deschiderea fisierului: ");
            return 1;
    }
    //Aici deschidem un descriptor de scriere, pentru a trimite raspunsul catre client.
    scriere = fopen(fisierFifoScriere, "w");
    if(citire == NULL){
            perror("Eroare la deschiderea fisierului: ");
            return 1;
    }
    //In aceasta bucla while vom citi continuu din fisierul de citire pana cand primim o comanda la care putem raspunde, iar atunci vom trece la partea de scriere
    //Sau cel putin acesta este planul :)
    while(1){
        //Partea de citire
        fscanf(citire, "%s", comandaDeCitit);
        //Partea de scriere
        if (strcmp(comandaDeCitit, "login") == 0){
            fprintf(scriere, "%s ", "test");
            fflush(scriere);
        }
    }
    return 0;
}

标签: clinuxfifomkfifo

解决方案


推荐阅读