名前つきパイプ(1)

"mkfifo"は標準ライブラリ関数ですが, パイプを紹介するためにシステムコールのところに入れています.

#include <sys/types.h>
#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);
"mkfifo"は"pathname"で指定されたFIFOファイルを作成します.
引数ないの"mode_t mode"は8進数で許可を指定します.


名前つきパイプ(1) Sample

/* send.c */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>

void error_message(const char *name);

int main(int argc, char **argv)
{
    int fd0;
    char buff[32] = "Send side Message...\n";

    if(access("fifo0", 0777) == EOF)
        mkfifo("fifo0", 0777);

    if((fd0 = open("fifo0", O_WRONLY)) == EOF)
        error_message("open");

    if(write(fd0, buff, strlen(buff) + 1) == EOF)
        error_message("write");

    printf("Succeed Send Message!\n");

    if(unlink("fifo0") == EOF)
        error_message("unlink");

    return 0;
}

void error_message(const char *name) {
    perror(name);
    exit(EXIT_FAILURE);
}
                            
if(access("fifo0", 0777) == EOF)
    mkfifo("fifo0", 0777);
システムコールの"access"は失敗したらファイルがないことを示し, そのエラーを利用し存在しない場合は名前つきパイプを作成し, その逆はパイプを作成しません.
int fd0;
if((fd0 = open("fifo0", O_WRONLY)) == EOF)
    error_message("open");
書き込み専用で名前つきパイプを開きます. "error_message"はエラー処理をまとめた関数です.
if(write(fd0, buff, strlen(buff) + 1) == EOF)
    error_message("write");
ファイルディスクリプタ"fd0"に"buff[32]"に格納された文字列を"strlen(buff) + 1"だけ書き込みます.
ちなみに"strlen()"は引数に指定された文字列の文字数をカウントする関数です.
/* client.c */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>

void error_message(const char *name);

int main(int argc, char **argv)
{
    int fd0;
    char buff[32];

    if((fd0 = open("fifo0", O_RDONLY)) == EOF)
        error_message("open");

    if(read(fd0, buff, 32) == EOF)
        error_message("read");

    printf("Message: %s", buff);

    return 0;
}

void error_message(const char *name) {
    perror(name);
    exit(EXIT_FAILURE);
}
int fd0;
if((fd0 = open("fifo0", O_RDONLY)) == EOF)
クライアント側は受信したデータを表示するため, "fifo0"を読み込み専用で開きます.
if(read(fd0, buff, 32) == EOF)
    error_message("read");
"fd0"に書き込まれたデータを"buff"に読み込みます.
printf("Message: %s\n", buff);
"buff"を表示.

"Terminal"を二つ開いて最初に"send"を実行し, 後に"client"を実行してください. 実行例

$ ./send
Succeed Send Message!

$ ./client
Message: Send side Message...