getCommandAndArgs 関数は新しいものですが、関数内のコードは以前に機能していたコードのコピーアンドペーストです。コマンドライン引数を許可してから、シェルの実行を続行しようとしています。fork プロセスと run プロセスが別の関数にある可能性があることはわかっていますが、この時点でプログラムがクラッシュする理由がわかるまで、これ以上先に進みたくありません。
char *cmd;
char *arguments[255];
char whitechars[] = " \n\t\r";
void getCommandAndArgs(char *tokLine) {
char *tok;
int i=0;
tok = tokLine;
while(tok != NULL) {
if(strcmp(tok, "exit")==0) {
printf("Thank you for using myshell!\n");
exit(0);
}
if(i==0) { cmd = tok; }
arguments[i] = tok;
tok = strtok(NULL, whitechars);
i++;
}
arguments[i]=NULL;
}
int main(int argc, char *argv[]) {
char *line, *tok;
int status=0;
int i;
pid_t pid;
if(argc > 1) {
line = *argv;
tok = strtok(line, whitechars);
tok = strtok(NULL, whitechars);
getCommandAndArgs(tok);
pid = fork();
if(pid == 0) {
execvp(cmd, arguments);
//oh $h!t message
fprintf(stderr, "What is this: %s\n", arguments[0]);
exit(0);
}
else {
waitpid(pid, &status, 0);
if(status !=0) {
fprintf (stderr, "error: %s exited with status code %d\n", arguments[0], status);
}
}
}
while((line = readline("myShell: ")) != NULL) {
if(strcmp(line, "")==0) {
continue;
}
tok = strtok(line, whitechars);
getCommandAndArgs(tok);
pid = fork();
if(pid == 0) {
execvp(cmd, arguments);
//oh $h!t message
fprintf(stderr, "What is this: %s\n", arguments[0]);
exit(0);
}
else {
waitpid(pid, &status, 0);
if(status !=0) {
fprintf (stderr, "error: %s exited with status code %d\n", arguments[0], status);
}
}
free(line);
}
printf("\nThank you for using myshell!\n");
return 0;
}