前提・実現したいこと
C言語でunixコマンドの「ps -A | more」と全く同じ動作をさせるプログラムを作成したいです.
発生している問題・エラーメッセージ
ps -Aの内容をmoreに渡して出力することはできていますが,moreコマンドが終わりません.
(最後までEnterキーを押しても終わらない)
######変更後
moreコマンドが終了するようになりましたが,
terminal
1#ps -A | more 211223 ? 00:00:00 kworker/4:3 311224 ? 00:00:00 kworker/2:0 411265 pts/9 00:00:00 ps 511266 pts/9 00:00:00 more
terminal
1#./a.out 211392 ? 00:00:00 kworker/2:2 311422 ? 00:00:00 kworker/3:0 411454 pts/9 00:00:00 a.out 511455 pts/9 00:00:00 ps
となり,ps -A | more と全く同じ動きにはなりませんでした.
該当のソースコード
c
1#include <sys/types.h> 2#include <stdio.h> 3#include <stdlib.h> 4#include <sys/stat.h> 5#include <sys/wait.h> 6#include <fcntl.h> 7#include <unistd.h> 8 9#define READ 0 10#define WRITE 1 11 12#define STD_in 0 13#define STD_out 1 14 15int main(int argc, char *argv[]) 16{ 17 int fd[2]; 18 pid_t pid1, pid2; 19 int status; 20 21 if(pipe(fd) < 0){ 22 perror("pipe"); 23 exit(EXIT_FAILURE); 24 } 25 26 pid1 = fork(); 27 28 if (pid1 == 0) 29 { 30 dup2(fd[WRITE],STD_out); 31 execlp("ps", "ps", "-A", NULL); 32 close(fd[WRITE]); 33 } 34 else if (pid1 > 0) 35 { //親 36 wait(&status); 37 } 38 else 39 { 40 perror("fork"); 41 exit(EXIT_FAILURE); 42 } 43 44 pid2 = fork(); 45 46 if (pid2 == 0) 47 { 48 dup2(fd[READ],STD_in); 49 execlp("more", "more", NULL, NULL); 50 } 51 else if (pid1 > 0) 52 { //親 53 wait(&status); 54 } 55 else 56 { 57 perror("fork"); 58 exit(EXIT_FAILURE); 59 } 60 61} 62
変更後
c
1#include <sys/types.h> 2#include <stdio.h> 3#include <stdlib.h> 4#include <sys/stat.h> 5#include <sys/wait.h> 6#include <fcntl.h> 7#include <unistd.h> 8 9#define READ 0 10#define WRITE 1 11 12#define STD_in 0 13#define STD_out 1 14 15int main(int argc, char *argv[]) 16{ 17 int fd[2]; 18 pid_t pid1, pid2; 19 int status; 20 21 if(pipe(fd) < 0){ 22 perror("pipe"); 23 exit(EXIT_FAILURE); 24 } 25 26 pid1 = fork(); 27 28 if (pid1 == 0) 29 { 30 dup2(fd[WRITE],STD_out); 31 execlp("ps", "ps", "-A", NULL); 32 } 33 else if (pid1 > 0) 34 { //親 35 wait(&status); 36 close(fd[WRITE]); 37 } 38 else 39 { 40 perror("fork"); 41 exit(EXIT_FAILURE); 42 } 43 44 pid2 = fork(); 45 46 if (pid2 == 0) 47 { 48 dup2(fd[READ],STD_in); 49 execlp("more", "more", NULL, NULL); 50 } 51 else if (pid1 > 0) 52 { //親 53 wait(&status); 54 } 55 else 56 { 57 perror("fork"); 58 exit(EXIT_FAILURE); 59 } 60 61}
試したこと
exit関数や,return 0;を入れてみましたが,execlp("more", "more", NULL, NULL);自体が終了しないため,解決には至りませんでした.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。