C 言語のpopen() の ”r”(リード) モードを再現しなくはならなくて困っております。
一応fork()で Parent プロセスと Child プロセスを 作り、 pipe() を作って そのパイプのファイルポインターに return しろという事で 精一杯やってみたのですがこの後どうすれば良いのか分からなくなってしまいました。
myargs[0] = strdup("ls"); この文では本来なら cmd を入れたいのですが、どのようにポインターを myargs[0] に入れれば良いのかわかりません。
その点も含めて御助力いただけたら幸いです。
よろしければどのように改善出来るか教えていただけたら幸いです。
C言語
コード #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> FILE *popen(const char *cmd, const char *mode){//cmd = LINUXコマンド、mode = モード FILE *fp;//戻り値 int fd[2]; // open pipe and fork, check for availability if(pipe(fd)== -1){ fprintf(stderr, "Pipe Failed"); } // popen part if (fork() == -1){ perror("fork failed\n"); exit(-1); }else if (fork() == 0){ close(fd[0]); close(STDOUT_FILENO); dup2(fd[1], STDOUT_FILENO); char *myargs[1]; myargs[0] = strdup(" ls"); myargs[1] = NULL; execvp(myargs[0], myargs); }else{ close(fd[1]); fp = fdopen(fd[1], "r"); //close(0); return fp; } }
課題なら他の学生などとお話し合いし
問題解決して下さい。
teratail では学校の質問などはうけつけません。
https://teratail.com/help/avoid-asking
コードのレイアウトが崩れてしまっていますので、マークダウンの<code>タグを使って修正してください。
質問欄は「編集」ボタンから変更することができます。
ああ。すいません。別に学生という訳では無いんです。
知り合いにこういう事は知っておいた方が良いからやってみろと言われまして。
説明する必要が無いと思って課題という風に書いてしました。
紛らわしくて申し訳ありません。
目的を明確にした方が良いです。
・簡易シェルを作る
・popenの実装の体験
後者であれば、exec部分は手を抜いて、
execlp("ls","ls",(char*)NULL);
あたりで十分です。
前者であっても、コマンドラインの構文解析、パイプ・リダイレクト、変数、構造を持った構文それぞれなど、別々にトライするのが良いと思います。必要なら、最後に組み合わせる。