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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

csh

cshは、C言語スタイルの構文を持つUNIX系OSのシェルの1つのことです。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

1回答

758閲覧

CSHでBG実行するプログラム

mame_suke2

総合スコア6

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

csh

cshは、C言語スタイルの構文を持つUNIX系OSのシェルの1つのことです。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2017/11/27 03:09

C言語でのシェル作成(csh)で、コマンドの最後に&をつけたときは引数とせずにコマンドをバックグラウンド実行(BG)させるプログラムを作成しています。
BGプロセスが終了した時には終了ステータスを取得し、プロンプトを表示する前に毎回のループで終了した子プロセスの有無をチェックしたいです。
そこで終了ステータスをどのように受けとればいいのか、終了ステータスの確認をどこで行えばいいか分かりません。お教えいただきますと幸いです。

###ソースコード

C

1 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5#include <unistd.h> 6#define MAX_ARGS 50 7#define MAX 500 8 9int main(void) 10{ 11 int argc; 12 int n = 0; 13 char input[MAX], *argv[MAX_ARGS], *cp; 14 char and = '&'; 15 char *bg; //文字列に&がなければNULL 16 int ret_code1; 17 pid_t pid; 18 pid_t pid2; 19 int pc=0; //プロセスカウンタ 20 21 while (1) { 22 //プロンプトの表示、コマンドの読み込み 23 n++; 24 printf("$ "); 25 fgets(input, sizeof(input), stdin); 26 printf("%s\n",input); 27 28 printf("%d process is running.\n", pc); 29 30 if( ret_code1 == 0 ){ 31 printf("SUCCESS! : pid1 = %d\n", pid1); 32 } 33 34 //and='&'を含んでいたらbg!=NULLにしてBG実行であることを明示 35 bg = strchr(input, and); 36 if( bg != NULL ) printf("==Run Background==\n"); 37 38 //コマンドを、'\n'や' 'で分割し,配列argvに格納 39 //NULLと&がきたら格納終了。これらは配列に入れない 40 cp = input; 41 for( argc = 0; argc < MAX_ARGS; argc++ ){ 42 if ((argv[argc] = strtok(cp," &\t\n")) == NULL) 43 break; 44 cp = NULL; 45 } 46 47 //分割用の配列を用意 48 char *str1[MAX_ARGS], *str2[MAX_ARGS]; 49 int comm=0, i=0, j=0; 50 51 //入力されたコマンドをstr1,str2に分割する 52 while (argv[i]) { 53 if (comm == 0) { 54 if (*argv[i] == '\0') { 55 comm = 1; 56 } else { 57 str1[i] = argv[i]; 58 str1[i+1] = NULL; 59 } 60 } else { 61 str2[j] = argv[i]; 62 str2[j+1] = NULL; 63 j++; 64 } 65 i++; 66 } 67 68 //内部コマンドの処理(quit,exitなら終了する) 69 if( strcmp(input,"exit") == 0 || strcmp(input,"quit") == 0){ 70 printf("Good-Bye!\n"); 71 exit(0); 72 //inputは場所を指すのでstrcmpで1文字ずつ比較している。0の時は等しい。 73 } 74 75 int status; 76 pid = fork(); 77 //fork()は呼び出し元プロセスを複製して新しいプロセスを生成する 78 //成功した場合、親プロセスには子プロセスのPIDが返され、子プロセスには0が返される(エラーは-1) 79 if (pid < 0) { 80 perror("fork"); 81 exit(-1); 82 } else if (pid == 0 && comm == 0) { 83 //子1プロセス時に実行 84 //printf("You are in child. p=%d\n", pid); 85 execvp (str1[0], str1); 86 exit(-1); 87 } else if (pid == 0 && comm == 1) { 88 //'\0'を含んでおり子1プロセス時に実行 89 //printf("You are in child. p=%d\n", pid); 90 execvp (str1[0], str1); 91 exit(-1); 92 } else if (comm == 1){ 93 //子プロセス1の終了を待つ 94 //waitpid( pid, &status, 0); 95 pid2 = fork(); 96 if (pid2 == 0) { 97 //子2プロセス時に実行 98 execvp (str2[0], str2); 99 exit(-1); 100 } 101 } else if (comm == -1){ 102 //エラー(-1)を返したら警告 103 printf("An error occurs.\n"); 104 exit(-1); 105 } 106 107 //親プロセス(bg==NULLのとき(&なし)子プロセス終了待機) 108 if( pid>0 ){ 109 if( bg == NULL ){ 110 waitpid( pid, &status, 0); 111 } 112 if( bg != NULL ){ 113 waitpid( pid2, &status, 0); 114 pc++; 115 } 116 } 117 } 118 exit(EXIT_SUCCESS); 119}

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

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

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

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

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

t_obara

2017/11/27 04:43

ご提示されたソースコードだと、どのような点で期待通りに動作しないのかも提示されると、回答が受けられやすいのではないでしょうか。
guest

回答1

0

sigaction()等で、SIGCHLDシグナルを受信するようにします。そして、そのシグナルハンドラ内で、waitpid()で子プロセスのステータスを取得します。

投稿2017/11/28 04:56

Harahira

総合スコア243

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問