私はUnixコマンドを受け取り、不正なアドレスエラーを受け続けるシェル "bosh>"を作ろうとしています。私は自分のコードがコマンドを読み込んで構文解析することを知っていますが、何らかの理由でそれらを実行させることができず、代わりに「不良アドレス」エラーが発生します。execvpでアドレスが正しくありません
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <sys/wait.h>
#define MAX_LINE 128
#define MAX_ARGS 10
int main(){
pid_t pid;
char command[MAX_LINE]; /*command line buffer*/
char *commandArgs[MAX_ARGS]; /*command line arg*/
int i;
char *sPtr=strtok(command," ");
int n=0;
printf("bosh>");
fgets(command, MAX_LINE-1,stdin);
command[strlen(command)-1]='\0';
while(strcmp(command,"quit")!=0)
{
n=0;
sPtr=strtok(command," ");
while(sPtr&&n<MAX_ARGS)
{
sPtr=strtok(NULL," ");
n++;
}
commandArgs[0]=malloc(strlen(command)+1);
strcpy(commandArgs[0],command);
if(fork()==0)
{
execvp(commandArgs[0],commandArgs);
perror("execvp failed");
exit(2);
}
pid=wait(NULL);
printf("%s",">");
fgets(command, MAX_LINE-1,stdin);
command[strlen(command)-1]='\0';
}
printf("Command (%d) done\n", pid);
return 0;
}
まず、美しい犬の絵です。 'fgets'によって読み込まれたバッファの最後の文字の後ろに終端のヌルバイト( '\ 0')が格納されます。だから、 ''\ 0' 'を入れる必要はありません。 –
@TonyTannousそれは改行を取り除くことです...(それも間違っていますが)。 –
最後の文字が実際には '' \ n ''であることを確認してから、それを切り捨てることを確認したいでしょう。 –