#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

const int LINEBUF = 16;

int main(int argc,char **argv){
int fd=0;
char buf[LINEBUF];
if(argc < 2){
fprintf(stderr,"filename must be specified\n");
exit(8);
}
fd = open(argv[1],O_RDONLY);
if(fd == -1 ){
fprintf(stderr,"file open error\n");
exit(8);
}

while((read(fd,buf,LINEBUF))>0){
int i;
//linenumberprint
fprintf(stdout,"%02x ",buf[i]);

//hexdump
for(i = 0; i<LINEBUF ;i++ ){
if(buf[i] == '\0'){
continue;
}
if(buf[i] == EOF){
break;
}
//fprintf(stdout,"%c",buf[i]);
fprintf(stdout,"%02x ",buf[i]);
}
//charcterprint

for(i = 0; i<LINEBUF ;i++ ){
if(buf[i] == '\0'){
continue;
}
if(buf[i] == EOF){
break;
}

fprintf(stdout,"%c",buf[i]=='\n' || buf[i]=='\t' ? '.' : buf[i] );
//fprintf(stdout,"%02x ",buf[i]);
}

puts("");
}


close(fd);
return 0;

}

プロセス間通信

流れのまとめ
1.種類
2.特徴
3.メリット・デメリット
4.深い理解

1.種類
pipe(半二重、FIFO、ストリームパイプ、名前つきストリームパイプ)
メッセージキュー
共有メモリ(ついでにセマフォ)
ソケット

※プラットフォームにより使えるIPCはまちまちである。
POSIX1で保障されていたのは、PIPEとFIFOだけだった

2.特徴
2-1pipe(半二重、FIFO、ストリームパイプ、名前つきストリームパイプ)
共通の祖先を持つ間でのみ、可能親と子の間で情報を受け渡すとか->子から子へも可能?

2-1.1pipe

仕組み:fdを二つ使って通信 pipe関数で作成、writeシステムコールでfd1へ書き込み、openシステムコールでfd2から読み込み

簡単なサンプル


#include <unistd.h>

#include <sys/syslimits.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/uio.h>


int main(){

int fds[2];

char *output[PIPE_BUF];//512文字

int nbytes=0;

pipe(fds);

write(fd[1],"teststr\n",9);

n = read(fd[0],output);

fprintf(stdout,"%s",output);

return 0;

}



2-1.2.popen

2-1.3.mkfifo


2-2メッセージキュー
2-2.1.msgget


2-3共有メモリ
(セマフォ?)

2-4ソケット






perlとかfreebsdのいかに楽をしてプログラムするかについてのTips
というか、それを探す旅路)の記録とか
趣味の自転車についてとか
大好きなゲーム(FPS系)とか
ぼちぼち勉強中の法律とかについて
ひまなときに書いていきたいと思います

というか、live○oorblogがあまりに重たいのでblogではno.1と名高い、
amebloに引越しました。
よろしくお願いします。
元ページ:http://livedoor.blogcms.jp/blog/cpdl