2016-12-09 2 views
0

Ich schreibe ein Programm, das unbegrenzt laufen sollte, wobei der Wert einer Variablen beibehalten wird. Zwei andere Programme könnten den Wert der Variablen ändern. Ich verwende Named Pipes, um den Variablenwert an externe Programme zu senden und zu senden.Lesen und Schreiben mit Named Pipes C

Hier ist mein Code für den Manager der Variablen.

manager.c:

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <pthread.h> 

char a = 'a'; 

void *editTask(void *dummy) 
{ 
    int fd; 
    char* editor = "editor"; 
    mkfifo(editor, 0666); 
    while(1) 
    { 
     fd = open(editor, O_RDONLY); 
     read(fd, &a, 1); 
     close(fd); 
    } 
} 

void *readTask(void *dummy) 
{ 
    int fd; 
    char* reader = "reader"; 
    mkfifo(reader, 0666); 
    while(1) 
    { 
     fd = open(reader, O_WRONLY); 
     write(fd,&a,1); 
     close(fd);  
    } 
} 

int main() 
{ 
    pthread_t editor_thread, reader_thread; 
    pthread_create(&editor_thread, NULL, editTask, NULL); 
    pthread_create(&reader_thread, NULL, readTask, NULL); 
    pthread_join (editor_thread, NULL); 
    pthread_join (reader_thread, NULL); 
    return 0; 
} 

Dieses Programm verwendet pThreads separat zu externen Werte für die Variable zu erhalten und den aktuellen Wert der Variablen zu externen Programmen zu kommunizieren.

Das Programm, das Werte zu schreiben in der Lage, auf die Variable ist:

writer.c:

#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    if(argc != 2) 
    { 
    printf("Need an argument!\n"); 
    return 0; 
    }   
    int fd; 
    char * myfifo = "editor"; 
    fd = open(myfifo, O_WRONLY); 
    write(fd, argv[0], 1);  
    close(fd); 

    return 0; 
} 

Das Programm, das den aktuellen Wert lesen konnte:

Leser .c:

#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() 
{ 
    int fd; 
    char * myfifo = "reader"; 
    fd = open(myfifo, O_RDONLY); 
    char value = 'z'; 
    read(fd, &value, 1); 
    printf("The current value of the variable is:%c\n",value);  
    close(fd); 

    return 0; 
} 

Ich lief System diese Programme in meinem Ubuntu wie folgt:

$ ./manager & 
[1] 5226 
$ ./writer k 
$ ./reader 
bash: ./reader: Text file busy 

Warum mein System erlaubt mir nicht, dieses Programm auszuführen?

Vielen Dank.

Antwort

2

Sie versuchen, sowohl das FIFO als auch das Leseprogramm "reader" aufzurufen.

Außerdem haben Sie keine Fehlerprüfung. Sie haben keine Ahnung, ob diese Aufrufe an mkfifo und open erfolgreich waren oder nicht. Dies ist wichtig, bevor Sie versuchen, eine Fehlerbehebung durchzuführen.

+0

Mein schlechtes. Ich habe überall gesucht, konnte diesen Fehler aber nicht finden. Ich dachte, es könnte irgendwo eine Einschränkung geben, wenn der Prozess versucht, parallel zu Pipes zu lesen und zu schreiben. Und was ist bei einer Fehlerprüfung von entscheidender Bedeutung? Ich meine, fast alle Funktionen können auf Fehler überprüft werden und ich kann mich nicht wirklich um sie kümmern. Und vielen Dank für Ihren Tipp zur Fehlerüberprüfung. Ich werde mir das merken. – user5393678

+0

@ user5393678 Jede Funktion, die eine realistische Chance auf einen Fehler aufweist, sollte mit einer Fehlerprüfung aufgerufen werden. Das sind so ziemlich alle. Offensichtlich ist es "offen", "mkfifo", "lesen" und "schreiben", da sie die ganze Zeit auf verschiedene Arten versagen. Und es ist fast keine Mühe, es ist ein einfaches Ausschneiden und Einfügen von 'if' /' perror' (oder verwenden Sie ein Makro). Und ehrlich gesagt, war es weniger lästig, mit verbundenen Augen zu suchen, ohne zu wissen, wo das Programm versagte? –