2016-05-28 15 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

FIFOはこのように動作しません。 2つのプログラムが必要です.1つはFIFOへの書き込み、もう1つは読み取りのみです。 –

+0

はい私はそれが私の目標だと知っていますが、テストするために1つのプログラムに書きました。しかし、読み込み部分を削除すると、同じ問題が発生します。 – Nono

+0

別のプログラムが読み込みのためにFIFOのもう一方の端を開くまで、プログラムはブロックされます。 –

答えて

1

FIFOは単なるスレッドでうまく動作しません。 書き込みが開かれるまで読み取りがブロックされ、その逆もありますので、RDWRモードで開く必要があります。そうしないとブロックされます。

例えば:

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

、あなたはFIFOバッファのサイズよりも多く書かないする必要があります(* 512 ulimit -pているのですか?)(または他のあなたはブロックされます)。その後、あなたが書いたものを読んだりする必要があります。 (それはFIFOを使用する通常の方法ではありませんが)

すべてのすべてで、これは動作するはずです:

#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; 
} 
関連する問題