C言語・Linuxについて fork システム・コールとpipe システム・コールとを用い、「./a.out file名 コマンド …」とすれば、「コマンド …」を実行し、コマンドの標準入力に与えられたデータと同じものをファイル名に控えをとるプログラムを作りたいです。 実行例は、 ./a.out stdin_log more -10 < /usr/include/X11/Xlib.h で、この場合「more -10」を実行し、その標準入力に与えられたデータの控えをstdin_log をいうファイルにとる。 ※「</usr/include/X11/Xlib.h」とするのは標準入力からデータを与えるためで、この場合、プログラムの引数には「<」より後は与えられない。 コードを書いてみたのですが、うまくいかないのでコードを教えていただきたいです。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv){ int pid, p_fd[2]; if (argc < 2) { fprintf(stderr,"usage: %s command arg...¥n",argv[0]); exit(1); } pipe(p_fd); if ((pid = fork()) == 0) { /* child process */ close(p_fd[0]); close(1); dup(p_fd[1]); close(p_fd[1]); execv(argv[1], &argv[2]); perror(argv[1]); exit(1); } /* parent process */ if (pid == -1) { perror("fork"); exit(1); } close(p_fd[1]); close(0); dup(p_fd[0]); close(p_fd[0]); execlp(argv[1], argv[2], NULL); exit(1); }
C言語関連