名前つきパイプ(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進数で許可を指定します.
LinuxベースのC言語を用いたシステムコールの利用方法.
"mkfifo"は標準ライブラリ関数ですが, パイプを紹介するためにシステムコールのところに入れています.
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
"mkfifo"は"pathname"で指定されたFIFOファイルを作成します.
/* 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"だけ書き込みます./* 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"を表示.
$ ./send
Succeed Send Message!
$ ./client
Message: Send side Message...