c - 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;
}
解决方案
推荐阅读
- python - 从现有的 Google 电子表格中获取响应、追加行和更新
- android - Android Studio 汽车 API
- c++ - 编写程序,导入三个浮点数a、b和c。按升序排序
- css - 如何更改 laravel 中的标准字体?字体松鼠
- mvvm - 为每个 Blazor 电路创建一次对象 (ViewModel)
- apache-spark - Google Cloud Storage 存储分区副本
- go - net.Interfaces() 带绑定细节
- python - 使用 Flask-SQLAlchemy 创建所有表
- excel - VBA - Add a folder name filter to a recursive DIR search
- amazon-web-services - AWS-SES 服务未使用 Boto3 在成功响应时发送批量模板电子邮件