プロセス間通信とか

昨日、今日と研修に行ってきました。内容はLinuxシステムプログラミングで、ファイルシステム、プロセス、シグナルを少しという感じでした。スレッドはなし。

リダイレクトは標準入力(出力)をcloseした後、作ったファイルディスクリプタdupするのね。

ネットワークプログラミングの研修もあるらしいので受けてみようかな。スレッドありそうだし。

内容が比較的濃いーのに講師がキレーなオネーサンという萌えポイントありでしたw

プロセス間通信の演習で僕がはまってたので質問しちゃいましたw

でも残念ながら時間切れで僕はその問題は解けず。。。orz

以下はキモいHello Worldです。とりあえずMac 10.5で動きました。

#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
	int fd1[2];
	int fd2[2];
	pid_t pid;
	int size;
	char buf[256];
	int status;

	if(pipe(fd1) < 0 || pipe(fd2) <0) {
		exit(1);
	}

	pid = fork();

	if(pid < 0) {
		exit(1);
	}

	if(pid == 0) {
		close(STDIN_FILENO);
		if(dup(fd1[0]) != STDIN_FILENO) {
			perror("dup() error stdin");
		}
		close(STDOUT_FILENO);
		if(dup(fd2[1]) != STDOUT_FILENO) {
			perror("dup() error stdout");
		}
		close(fd1[0]);
		close(fd1[1]);
		close(fd2[0]);
		close(fd2[1]);
		execlp("cat", "cat", (char*)0);
	}
	
	close(fd1[0]);
	close(fd2[1]);

	if(write(fd1[1], "Hello, World!\n", 14) != 14) {
		perror("write error");
	}
	close(fd1[1]);

	while((size=read(fd2[0], buf, 256)) != 0) {
		if(write(STDOUT_FILENO, buf, size) != size) {
			perror("write error");
		}
	}
	close(fd2[0]);

	if(waitpid(pid, &status, 0) < 0) {
		perror("waitpid error\n");
	}

	exit(0);
}

明日も1日Linuxカーネルの研修。今度は座学なので寝そうだ。。。