2016-05-28 17 views
2

Ich möchte eine Named Pipe erstellen und dann darauf schreiben und danach möchte ich es lesen. Hier ist mein Code:C - Erstellen/Schreiben/Lesen Named Pipe

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <errno.h> 
#include <string.h> 
#include <fcntl.h> 
#define FIFO "fifo0001" 
int main(intargc, char *argv[]){ 
    char input[256]; 
    FILE *fp; 
    char str[50]; 
    printf("Please write some text:\n"); 
    scanf("%s", input); 
    unlink(FIFO); /* Because it already exists, unlink it before */ 
    umask(0); 
    if(mkfifo(FIFO, 0666) == -1){ 
     printf("Something went wrong"); 
     return EXIT_FAILURE; 
    } 
    if((fp = fopen(FIFO, "a")) == NULL){ 
     printf("Something went wrong"); 
     return EXIT_FAILURE; 
    } 
    fprintf(fp, "%s", input); 
    if(fgets(str, 50, fp) != NULL){ 
     puts(str); 
    } 
    fclose(fp); 
    return EXIT_SUCCESS; 
} 

Nachdem ich einen Text geschrieben habe, passiert nichts mehr. Und es gibt keine Nachricht. Ich muss das Programm mit STRG C beenden. Jemand weiß, was los ist? Ich muss die Funktionen mkfifo, fopen, fprintf, fgets und fclose verwenden. Es wäre schön, wenn ich sie im Code behalten könnte.

+0

FIFOs auf diese Weise nicht funktionieren. Sie benötigen zwei Programme, von denen eines (nur) in den FIFO schreibt und das andere (nur) liest. –

+0

Ja, ich weiß, das ist mein Ziel, aber ich schrieb in einem Programm, um es zu testen. Aber wenn ich den Leseteil entferne, gibt es das gleiche Problem – Nono

+0

Ihr Programm blockiert, bis ein anderes Programm das andere Ende des FIFO zum Lesen öffnet. –

Antwort

1

FIFOs funktionieren nicht gut mit nur einem Thread. Sie werden bei einem offenen Lesevorgang blockiert, bis ein Schreibvorgang ausgeführt wird und umgekehrt. Sie müssen also im RDWR-Modus öffnen oder Sie werden blockiert.

Z. B .:

fp = fopen(FIFO, "r+"); 

dann müssen Sie nicht mehr als die Größe des FIFO-Puffer schreiben (die ulimit -p * 512?) (Oder auch Sie blockiert werden). Danach müssen Sie nicht mehr lesen als das, was Sie geschrieben haben.

Alles in allem sollte diese Arbeit (obwohl es nicht der üblicher Weg ist FIFOs zu verwenden):

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <errno.h> 
#include <string.h> 
#include <fcntl.h> 
#define FIFO "fifo0001" 

int main(int argc, char *argv[]){ 
    char input[256] = "hw"; 
    FILE *fp; 
    char str[50]; 
    printf("Please write some text:\n"); 
    scanf("%s", input); //!!! 

    size_t input_len = strlen(input); 

    unlink(FIFO); /* Because it already exists, unlink it before */ 
    umask(0); 
    if(mkfifo(FIFO, 0666) == -1){ 
     printf("Something went wrong"); 
     return EXIT_FAILURE; 
    } 
    if((fp = fopen(FIFO, "r+")) == NULL){ 
     printf("Something went wrong"); 
     return EXIT_FAILURE; 
    } 
    fprintf(fp, "%s", input); 
    if(fgets(str, input_len+1, fp) != NULL){ 
     puts(str); 
    } 
    fclose(fp); 
    return EXIT_SUCCESS; 
} 
Verwandte Themen