2016-05-28 4 views
2

Я хочу создать именованный канал, а затем записать его, а затем я хочу его прочитать. Вот мой код:C - Создать/написать/прочитать именованный канал

#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; 
} 

После того, как я напишу текст, больше ничего не произойдет. И нет сообщения. Мне нужно бросить программу с помощью STRG C. Кто-то знает, что не так? Я должен использовать функции mkfifo, fopen, fprintf, fgets и fclose. Так было бы неплохо, если бы я мог держать их в коде.

+0

FIFOs не работает таким образом. Вам нужны две программы, одна (только) запись в FIFO, а другая (только). –

+0

Да, я знаю, что это моя цель, но я написал в одной программе, чтобы проверить ее. Но когда я удаляю читающую часть, возникает та же проблема. – Nono

+0

Ваша программа будет блокироваться, пока другая программа не откроет другой конец FIFO для чтения. –

ответ

1

FIFO не работает с одной нитью. Вы будете заблокированы при чтении до тех пор, пока не будет выполнено открывание записи, и наоборот, поэтому вам нужно открыть в режиме RDWR или заблокировать.

т.д .:

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

, то вам нужно, чтобы написать не больше, чем размер буфера FIFO (который ulimit -p * 512?) (Или же вы заблокированы). После этого вам нужно будет прочитать не более того, что вы написали.

В целом, это должно работать (хотя это не обычный способ использования FIFOs):

#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; 
}