質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1161閲覧

C言語についてです(マルチプロセス)

Cchan

総合スコア35

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/15 02:43

編集2018/11/15 02:45

簡単なシェルのようなものを作りたいのですが、プロセスが複製されていないもしくは、シェルを実行するコマンドがうまくいきません・・・

C

1#include<stdio.h> 2#include<unistd.h> 3#include <string.h> 4#include<sys/wait.h> 5 6int main(){ 7 char command[100]; 8 char p[3][10]; 9 printf(">"); 10 fgets(command,100,stdin); 11 12 char *tp = strtok(command," "); 13 strcpy(p[1],tp); 14 int count=1; 15 while(tp!=NULL){ 16 tp=strtok(NULL, " "); 17 count+=1; 18 if(tp!=NULL)strcpy(p[count],tp); 19 } 20 pid_t pid = fork(); 21 if (pid > 0 ){ 22 int ret; 23 waitpid(pid,&ret,0); 24 } 25 else{ 26 char* cmd[]={p[1],p[2],NULL}; 27 execvp(cmd[0], cmd); 28 } 29 30 }

入力文字の切り分けはうまくいっているようなのですが、肝心のシェルがうまくいきません・・・

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

失礼しました。間違って投稿してしました。削除します。

投稿2018/11/29 11:44

編集2018/11/29 11:46
tatsu99

総合スコア5424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

問題点は以下の2つです。
1.fgetsは最後に改行コードがつくので、それを削除してから、excevpに渡す必要があります。
2.char* cmd[]={p[1],p[2],NULL}; は、コマンドが引数を1つとる場合の記述になっています。
ls -all はOKですが、ls とか la -all -t 等の場合は正しき動作しません。

上記に関して修正したソースを提示しておきます。
(厳密に言えば、非常に長いコマンドとか引数が11以上の場合の対処などが必要ですが、その対策はしていません)

C

1#include<stdio.h> 2#include<unistd.h> 3#include <string.h> 4#include<sys/wait.h> 5 6int main(){ 7 char command[100]; 8 char p[10][100]; 9 printf(">"); 10 fgets(command,100,stdin); 11 int len; 12 len = strlen(command); 13 command[len-1] = '\0'; 14 char *tp = strtok(command," "); 15 strcpy(p[0],tp); 16 int count=1; 17 while(tp!=NULL){ 18 tp=strtok(NULL, " "); 19 if(tp!=NULL){ 20 strcpy(p[count],tp); 21 count+=1; 22 } 23 } 24 pid_t pid = fork(); 25 if (pid > 0 ){ 26 int ret; 27 waitpid(pid,&ret,0); 28 } 29 else{ 30 char* cmd[]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; 31 int i; 32 for (i=0;i < count;i++){ 33 cmd[i] = p[i]; 34 } 35 execvp(cmd[0], cmd); 36 perror(cmd[0]); 37 } 38 39 } 40

投稿2018/11/15 04:13

tatsu99

総合スコア5424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cchan

2018/11/19 17:16

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問