###前提・実現したいこと
C言語の自作シェル内でシグナルハンドラを使って自作psコマンド
(現在動いているプロセスのIDを表示するという簡単な関数)を作成したい
###発生している問題・エラーメッセージ
<コード訂正後>
removeProcess
でarr_pid
配列のプロセスIDが子プロセス終了後-1に書き換えが行われない => 今まで行った全てのプロセスのプロセスIDが表示されてしまう
<コード訂正前>
(1)HELP1で子プロセスを配列に格納する際に親プロセスと同じプロセスIDが格納されてしまう
(2)HELP2でセグメンテーション違反が起こる
=>指摘を受けポインタを使いまわすのをやめる&int型ポインタの配列をint型配列に変更後し解決
###該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <unistd.h> 4#include <string.h> 5#include <sys/wait.h> 6#include <errno.h> 7#define S 1000 8 9int arr_pid[S] = {}; /* ここにプロセスが呼ばれる度新しいプロセスIDを登録 */ 10 11void removeProcess(int signal){ 12 pid_t pid; 13 while((pid = waitpid(-1, NULL, WNOHANG)) > 0){ 14 /* 子プロセスが終了したら子プロセスのPIDを-1に変える */ 15 for(int i=0; arr_pid[i] != 0; ++i){ /** HELP2 **/ 16 if(arr_pid[i] == signal){ 17 arr_pid[i] = -1; 18 } 19 } 20 } 21} 22 23void printProcess(){ 24 int i; 25 for(i=0; arr_pid[i] != 0; ++i){ 26 if(arr_pid[i] != -1){ 27 printf("PID: %d\n", arr_pid[i]); 28 } 29 } 30} 31 32int main(int argc, char *argv[]){ 33 char* token[S]; 34 char* eof; 35 char* and; 36 char usrin[S]; 37 int pid, status, count, num_p = 0; 38 39 40 pid = getpid(); 41 arr_pid[num_p++]= pid; /* 親プロセスのプロセスIDを取得しarr_pidに入れる */ 42 signal(SIGCHLD, &removeProcess); /* 子プロセスが終了=>SIGCHLDシグナルが送られる度配列に入れたプロセスIDを-1に変更 */ 43 44 while(1){ 45 printf(">>"); 46 eof = fgets(usrin, sizeof(usrin), stdin); 47 48 if(eof==NULL) 49 exit(0); 50 51 usrin[strlen(usrin)-1] = '\0'; 52 and = strchr(usrin, '&'); 53 54 token[0] = strtok(usrin, " "); 55 for(count=1; count<S; ++count){ 56 token[count] = strtok(NULL, " "); 57 if(token[count]==NULL) 58 break; 59 } 60 61 /* 入力がmy_psなrプロセスを出力 */ 62 if((strcmp(token[0], "my_ps")==0)){ 63 printProcess(); 64 } else { 65 /* my_ps 以外なら入力されたコマンドを実行 */ 66 pid = fork(); 67 68 69 if(pid==-1) 70 exit(-1); 71 else if(pid==0){ 72 if(execvp(token[0], token)<0){ 73 printf("エラー : %s\n", strerror(errno)); 74 exit(1); 75 } 76 } else { 77 /* 子プロセスのプロセスIDを配列に格納 */ 78 arr_pid[num_p++] = pid; 79 if(and==NULL) 80 wait(&status); 81 82 } 83 } 84 } 85 86 return 0; 87}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/19 23:12
退会済みユーザー
2017/11/19 23:18
2017/11/19 23:53
退会済みユーザー
2017/11/20 00:16 編集
2017/11/20 00:49 編集
退会済みユーザー
2017/11/20 01:13 編集
2017/11/20 01:18
退会済みユーザー
2017/11/20 01:21 編集
2017/11/20 01:30