###前提・実現したいこと
C言語でLINUXの自作シェルの作成をしています。
今は jobs と fg を内部コマンドとして追加することをしていますがうまくいきません。
jobsではBG実行されているプロセス一覧を表示する。(jobsコマンド時に通し番号をつけて表示する)
fgではBG実行プロセスのうち、指定した一個をFGに切り替える。(fgコマンドではその番号を指定してFGに切り替える)
以上の二つを実現したいです。
###発生している問題・エラーメッセージ
今、何個のプロセスがBG実行されているのかの数え方が分かりません。
子プロセスのところでp_n++を使って子プロセスが実行された回数を調べようと思ったのですが、うまく数えることができないです。
###該当のソースコード
.#include <stdio.h>
.#include <stdlib.h> //exitを使うために取り込む
.#include <unistd.h> //execvとforkを使うために取り込み
.#include <string.h> //strtokとstrcmpを使うために取り込み
.#include <sys/wait.h> //waitpidを使うために取り込み
int main(void) {
pid_t pid; //プロセスの生成
char com[256]; //文字読み込み用
char *argv[256];
char *ptr; //ポインタ
int i; //ループ時のカウンタ
char *and; //文字列に&がなければNULL
char a = '&';
int status;
int p_n = 0; //プロセスの数を数える
//whileループ
while(1) {
//プロンプト表示 printf("prompt: "); //入力読み込み fgets(com, sizeof(com), stdin); //入力した文字列に&がついてるか判断 and = strchr(com, a); //argv1に上で読み込んだcomを代入 argv[0] = strtok(com, " \n\0"); //ループさせてポインタを動かす //strtokを使い空白とエンターで分解 //ポインタを使い分解したものを配列に入れていく for(i = 1; i < 256; i++) { ptr = strtok(NULL, " &\n\0"); argv[i] = ptr; //文字列が分解し終わったらループを抜け出す if (ptr == NULL) break; } //判断 exit quitなら終了 if(strcmp(com,"exit") == 0 || strcmp(com,"quit") == 0) exit(0); //分裂(fork) 新しいプロセスをつくる pid = fork(); //プロセス作成に失敗したときは、0未満を返す if(pid < 0) { printf("error\n"); exit(-1); } //親と子の判断 //子プロセス //子プロセス読み込んだコマンドを実行(execv) //exitで抜け出す if(pid == 0) { execv(argv[0], argv); p_n++; exit(0); } //親プロセス //andがNULLの時(&がない時) //親プロセス待機(子プロセス終了待ち) if(pid > 0) { if(and == NULL){ waitpid(pid, &status, 0); } } /*jobs 稼働状況の表示(ループ) [通し番号] プロセス名*/ printf(" %d\n",p_n); for(i = 0; i < 0; i++){ //通し番号 printf("[%d] ", i); //ジョブ名(ファイル名) printf("%s \n", com); } //一つに戻り再開(ループ)
}
return 0;
}
###最後に
どなたかわかる方教えていただけたらありがたいです。