質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1280閲覧

リダイレクト機能の実装

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/22 07:06

以下のコードにリダイレクト機能を追加したいです。
例えば

echo hello > hello.txt cat hello.txt hello

といった感じです。自分の考えとしてはargs[i]が「>」であった場合args[i+1]のファイルをオープンし、「>」の左側のコマンドをargs[i+1]のファイルに実行するという感じです。
下のコードでファイルオープンするところまで書いてみましたがそれ以降どのようにコードを書いていけば良いのでしょうか?

for(i=0; i<nargs; i++) { if(strcmp(args[i], ">") == 0) { int fd = open(args[i+1], O_WRONLY); if(fd < 0) die(args[i+1]); close(fd);
#include<stdio.h> #include<stdlib.h> #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 #define NBUF 1 void die(const char *s) { perror(s); exit(1); } int main(int argc, char *argv[]) { int pid, status,i,j; char line_in[MAX_LINE_IN]; char *args[MAX_ARGS]; int nargs; for(;;){ printf("> "); if (fgets(line_in, MAX_LINE_IN, stdin) == NULL) exit(0); line_in[strlen(line_in) - 1] = '\0'; char *token = strtok(line_in, " "); nargs = 0; args[nargs++] = token; while( token != NULL){ if (token != NULL){ token = strtok(NULL, " "); args[nargs++] = token; } } args[nargs] = NULL; if(strcmp(args[0], "exit") == 0) exit(0); pid = fork(); if(pid < 0){ fprintf(stderr, "Error fork %d\n", getpid()); exit(EXIT_FAILURE); } else if(pid == 0){ for(i=0; i<nargs; i++) { if(strcmp(args[i], ">") == 0) { int fd = open(args[i+1], O_WRONLY); if(fd < 0) die(args[i+1]); close(fd); } } execvp(args[0], args); printf("Command Not Found.\n"); exit(1); } else{ wait(&status); } } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

'>' 以降はシェルに食われてしまい、argv[] には '>' の手前までしか届きません。

C

1// hello.c 2#include <stdio.h> 3int main() { 4 printf("hello\n"; 5 return 0;

これで十分。hello > hello.txt してみて。

投稿2021/05/22 07:16

編集2021/05/22 07:25
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/22 07:37

たしかにそれでhello.txtに helloが出力されているのは確認できたのですが… 上のコードにリダイレクト機能の追加をしたいです
episteme

2021/05/22 07:43

いやだから、「コマンドラインに置かれた '>' はシェルに食われてしまうので argv[] には届きません」って。 リダイレクトはシェルのおシゴトですってば。 hello -o hello.txt なんてな具合に、「-o オプション付ければ(標準出力じゃなく)ファイルに吐くよ」ならともかく。
退会済みユーザー

退会済みユーザー

2021/05/22 07:46

あ、理解しました ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問