UNIXシステムコールに関する質問です.
パイプシステムを用いて,与えられたコマンドを実行し,コマンドの標準入力に与えられたデータを指定したファイルにコピーするプログラムを作成したいのですがどうもうまく作動しません.
指摘アドバイス,回答お願いします.
例えば[./a.out file ls]とすればlsを実行し,その標準出力の内容がfileに保存されます.
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <unistd.h> 4#include <fcntl.h> 5 6#define BSIZE 512 7main(int argc, char **argv) 8{ 9 int pid, p_fd[2], fd; 10 char *new_program, **new_argv; 11 char buf[BSIZE]; 12 13 if (argc < 2) { 14 fprintf(stderr,"usage: %s command arg...\n",argv[0]); 15 exit(1); 16 } 17 18 pipe(p_fd); 19 20 if ((pid = fork()) == 0) { 21 /* child process */ 22 close(p_fd[0]); 23 close(1); 24 dup(p_fd[1]); 25 close(p_fd[1]); 26 27 new_program = argv[2]; 28 new_argv = &argv[2]; 29 execvp(new_program,new_argv); 30 perror(new_program); 31 32 exit(1); 33 } 34 35 /* parent process */ 36 if (pid == -1) { 37 perror("fork"); 38 exit(1); 39 } 40 41 close(p_fd[1]); 42 close(0); 43 dup(p_fd[0]); 44 close(p_fd[0]); 45 46 fd = open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0644); 47 while (read(p_fd[0],buf,BSIZE) != 0) { 48 write(fd,buf,BSIZE); 49 } 50 close(fd); 51 52 exit(1); 53}
子プロセスでコマンドの実行,親プロセスで標準入力をファイルに書くという考え方をしています.
回答2件
あなたの回答
tips
プレビュー