前提・実現したいこと
c言語でリダイレクトを作りたいのですが、なかなかうまく行きません。
初心者ですので簡単なミスかもしれませんが、結構考えて答えにたどり着かなかったので質問させていただきます。
該当のソースコード
コード #include<unistd.h> #include<string.h> #include<fcntl.h> #include<sys/types.h> #include<sys/wait.h> #define MAX_LINE_IN 1000 #define MAX_ARGS 30 void redirect(char *args[], int REDI){ int fd; // printf("%sこれにリダイレクトします。\n", args[REDI]); fd=open(args[REDI], O_WRONLY | O_CREAT, 0664); close(STDOUT_FILENO); dup(fd); execvp(args[0],args); } int main(int argc, char *argv[]){ int pid, status; char line_in[MAX_LINE_IN]; char *args[MAX_ARGS]; int nargs; int REDI; for(;;){ printf("> "); if(fgets(line_in, MAX_LINE_IN, stdin) == NULL) exit(0); line_in[strlen(line_in) - 1] = '\0'; REDI=0; char *token = strtok(line_in, " "); nargs = 0; args[nargs++] = token; while(token != NULL){ token=strtok(NULL, " "); if(token != NULL){ args[nargs++]=token; if(strcmp(token,">")==0){ REDI=nargs; } } } args[nargs] = NULL; if(strcmp(args[0], "exit")==0) break; if(fork()==0){ if(REDI!=0){ redirect(args, REDI); } execvp(args[0],args); printf("command not found\n"); exit(1); } else{ wait(&status); } } return 0; }
試したこと
『これにリダイレクトします。』というところは>を実行した時に表示されていたので、redirectの関数の中には入っているようです。またその関数の中に入ったargs[REDI]の文字列もレダイレクトの対象とするテキストファイル名が入っていたので問題ないと思います。
このコンパイルに関してはエラーはありませんでした。
実行 > echo hello > text.txt
これを実行した時は
text.txtのファイルに hello > text.txt という文字列が入りました。
実行 > cal > text.txt
とした時には cal: year `text.txt' not in range 1..9999
というエラーが出てtext.txtには何も入りませんでした。
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー