C言語のシェルプログラミングの課題が分かりません。
C言語のシェルプログラミングを作れという課題で、以下のように作ったんですが、実行して何度かコマンドを入力した後、exitによって一発で終わらせることができません。どのように書き換えればいいか教えて下さい。 また、他にも書き換えた方がよいと思えるところがあったら是非教えて下さいm(_ _)m
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include MAX_ARGS 10
#include MAX_LEN 100
extern char **environ;
void child(int argc, char *argv[MAX_ARGS]);
int main(void){
int argc, n = 0;
int status;
char input[MAX_LEN], *argv[MAX_ARGS], *cp;
const char *delim = "\t\n";
while (1){
++n;
printf("$ ");
fflush(stdout);
if(fgets(input, sizeof(input), stdin) == NULL){
break;
}
cp = input;
for(argc = 0; argc < MAX_ARGS; argc++){
if((argv[argc] = strtok(cp, delim)) == NULL)
break;
cp = NULL;
}
if(strcmp(argv[0], "exit") == 0){
exit(0);
}
pid_t pid = fork();
if(pid == -1){
perror("fork");
exit(1);
}else if(pid == 0){
child(argc, argv);
}else{
wait(&status);
}
}
return 0;
}
void child(int argc, char *argv[MAX_ARGS]{
execvp(argv[0], argv);
}
お礼
お礼が遅くなってしまい申し訳ありません。 とても丁寧でためになるご回答ありがとうございます。 OS依存という訳ではなく、現在の実行環境がベルの鳴動をサポートしてなかったのですね。 ずっと間違って認識していたので、理解できて良かったです! ありがとうございました。