apple apple banana orange orange orange grape apple
のような入力ファイルをコマンドライン引数として与えられたとき,5と返すようなC言語のプログラムを,fork,exec, pipe, dupのすべてを用いて作成したいです.ファイル入出力、プロセス制御、パイプ生成等に関しては、高水準ライブラリ関数を使用しない方向で考えています.
考えとしては,forkで子プロセスを作って親の方で重複行の削除,その出力をpipeで子供に入力として渡し,そこで行をカウントして標準出力する,というふうに思っているのですが,dupをどこで用いればいいのかわかっていないので教えていただきたいです.
もしくは,考え方自体があまりよくなく,他の方法がある場合にはそれを教えていただきたです.
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<sys/types.h> 4#include<sys/stat.h> 5#include<fcntl.h> 6#include<unistd.h> 7 8int main(int argc, char **argv){ 9 10 if(argc != 2){ 11 perror("the number of command line arguments is wrong."); 12 exit(1); 13 } 14 15 int ifd; 16 int status; 17 int fd[2]; 18 ssize_t cc; 19 pid_t ret; 20 char buf[1024]; 21 22 if(pipe(fd) < 0){ 23 perror("pipe"); 24 exit(1); 25 } 26 27 ret = fork(); 28 if(ret < 0){ 29 perror("fork"); 30 exit(1); 31 } 32 33 if(ret== 0){ 34 //行を数えて標準出力 35 } 36 else{ 37 if( (ifd = open(argv[1], O_RDONLY) ) == -1 ){ 38 perror("open"); 39 exit(1); 40 } 41 //read, writeなどを用いて連続的な重複行を除いた物を作る 42 } 43}
1つのプロセスで処理するののに何も問題ないと思いますが、なんで fork/exec/pipe/dup を使いたいのでしょうか。
システムコールの動きを見るためです.
高水準ライブラリ関数などを用いたりしてよいのならば簡単に済ませられるようなものなのですが,これらを用いてみると今までのシステムコールの学習のまとめになってよいのではないかと教えたいただいたので考えてはみたのですが,理解がまだまだのようで具体的に組み立てられていない,という状態です.
それをほぼ全部質問するようでは理解のまとめにならないのでは。
背伸びしすぎじゃない? 「7割できそうなことに挑戦」を繰り返しては?
# まずは fork/exec から
回答2件
あなたの回答
tips
プレビュー