• ベストアンサー

コマンド実行結果のエラー標準出力制御について

unix-cにて子プロセスにてexecvp()を使用しmailxコマンドを実行し、親プロセスにてmailxコマンドの実行結果に出力処理をしたいのですが、 どんなことがあろうと(パスが違うなど)標準出力させたくありません。 現在、fork(),pipe()を駆使して正常系は上手くできるようになったのですが、エラー時の標準出力(親、子とも)を防ぐことが できません。何か良い方法はないでしょうか?

  • sting
  • お礼率12% (35/274)

質問者が選んだベストアンサー

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

エラー出力は標準エラー出力に出力されます。 標準エラー出力をpipe()で取り込めば良いと思われます。

sting
質問者

お礼

回答ありがとうございます。 以下のようにして一応できました。しかし、自分で作っておきながら なぜ上手くいってるのか・・・。 親プロセスがわにclose(2)を書くと上手くいかないのはなぜでしょうか? void main(){ int pfd[2]; int pid; pipe(pfd); if (fork() == 0) { close(2); close(1); dup2(pfd[0],0); close(pfd[0]); close(pfd[1]); execvp("mailx",NULL); exit(); } else { close(pfd[0]); fp = fdopen(pfd[1],"w"); fprintf(fp,"s %s\nq\n","/tmp/exa/mail1"); fclose(fp); wait(0); } } ~

関連するQ&A

  • 子プロセスのコマンド結果

    pipe(),fork(),dup2()等を駆使し、子プロセスにコマンドを実行させる処理にて、 子プロセスの実行したコマンドが入力待ちか処理終了しているかを判定する方法ってありますで しょうか?

  • teeコマンドを使わずにUNIXで標準出力とエラー出力を、ファイルと標準出力の両方に出すには?

    UNIX系のBシェルで、 コマンドを実行して、 その標準出力とエラー出力をログファイルに出力し、 かつ、同じものを標準出力にも出力したいのです。 また、その後でコマンドの戻り値$?をエラーチェックしたいです。 このため、パイプでteeコマンドを使用すると戻り値が上書きされてしまいます。 いったん一時ファイルに出力するしかないのでしょうか?

  • python: fork後の標準出力について

    言語はpythonです。(バージョン : 2.6.6) 以下の二つの単純なpythonスクリプト   test.py, exe_fork.py があります。 [test.py] #!/usr/bin/env python import subprocess proc = subprocess.Popen("./exe_fork.py", stdout=subprocess.PIPE) result = proc.stdout.read() print result [exe_fork.py] #!/usr/bin/env python import os import time pid = os.fork() if pid != 0: print "parent\n" else: time.sleep(5) print "child\n" [動作] 各スクリプトの動作としては、 test.pyがexe_fork.pyをPopen(stdoutはPIPEで受信)で実行し、 read()メソッドでexe_fork.pyの標準出力を受け取り、表示する。 exe_fork.pyはforkして、   親プロセスは"parent"と出力   子プロセスは5秒後に"child"と出力 です。 [実行結果] test.pyを実行すると 5秒後に   parent   child と表示されました。 これを実行する前は実行後すぐに "parent" と表示されてスクリプト終了するのだと予想しておりました。 しかし実際はexe_fork.pyの親と子の両方のプロセス終了するまで何も表示されず 両プロセスが終了した後にtest.pyのread()メソッドが完了するようです。 (どういうしくみでそうなっているのかよくわかりません。。) [質問・相談] test.pyでexe_fork.pyの親プロセスの標準出力だけを反映する方法ございませんでしょうか? なお、都合上、以下の条件を満たしている必要がございます。  条件1: test.py側のソースは変更しない  条件2: exe_fork.pyの親プロセスが終了した時点でtest.pyのread()メソッドが終了する  条件3: forkptyは使わない [参考]  exe_fork.py側で子プロセスのみsys.stdout.close()してみましたが結局exe_fork.pyの子プロセスが終了するまで(=5秒経過するまで)test.pyのread()メソッドは完了しませんでした。   よろしくお願いします。

  • DOSコマンドで、標準出力を出力しないようにするには?

    Windowsのバッチファイルでコマンドを実行する際、標準出力をディスプレイに表示したくないのですが、どのようにするのが、一般的なのでしょうか? CDで実行するので、ファイルに出力はしたくありません。 UNIXとかだと、nullにパイプするようなのですが…。

  • 標準エラー出力の可否操作について

    unix-cプログラムにてpopen()等により実行した結果、 popen()の引数に設定したコマンドのパスが設定されていない場合 標準エラー出力をはいてしまいます。 close(2)を実行することにより出力はまぬがれるのですが、 他箇所の標準エラー出力は表示させたいためclose(2)では実現できません。 何かpopen()実行時の標準エラー出力をさせず処理を進める良い方法はありませんでしょうか

  • classファイルとJARファイルで実行した出力が異なる

    Javaのコマンドラインツールです。 CLASSファイルのままで実行 C:\> java -classpath .;mail.jar;activation.jar Mailx すると正常な出力が得られるプログラムをJARファイルにして C:\> jar xvf activation.jar C:\> jar xvf mail.jar C:\> jar cfm Mailx.jar Mailx.mf *.class com javax C:\> jar tvf Mailx.jar 実行 C:\>java -classpath Mailx.jar Mailx すると、正常な出力が得られなくなり、メールアドレスが出力されるはずが、メモリのアドレスのような値が出力  javax.mail.util.SharedByteArrayInputStream@1bf52a5 されるようになります。 なぜなのでしょうか? <Mailx.mf> Manifest-Version: 1.0 Main-Class: Mailx

  • 処理結果(標準出力と標準エラー出力)をファイルと画面の両方に出力する方

    処理結果(標準出力と標準エラー出力)をファイルと画面の両方に出力する方法はありますか? 当方 処理結果(標準出力と標準エラー出力)をファイルに出力する際に iroirona_command > log.log 1>&2 ・・・ファイルに出力されるが画面には表示されない。 iroirona_command ・・・画面には表示されるがファイルには出力されない。 と書いて標準出力と標準エラー出力を出力させているのですが、 ファイルと画面の2つの出力先に出力したいと考えています。 可能なのでしょうか? 環境 Windows XP SP3

  • 標準出力、標準エラー出力 以外の出力??

    Linux上のCADツールが端末に出力してくる文字列をファイルに落とすことができないで困っています。 どのようなことが起きているのでしょうか? また、このような場合、どのようにしたら端末上に流れる文字をすべてファイルとして保存できるのでしょうか。 %> CAD_TOOL.exe |& tee log として標準出力、標準エラー出力の両方をlogというファイルにおとしたつもりなのですが、画面に流れたすべての文字列が保存されている訳ではないのです。 Linuxの出力には標準出力と標準エラー出力の2つ(だけ)がある[*]、と思っていましたが他の出力方法があったりするのでしょうか。。。 [*]http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8 宜しくお願いします。

  • UNIXでのコマンドエラーについて

    初心者です。 UNIX上で下階層を含めて存在するファイルの数を知りたかったので ネットで検索して for d in `find . -type d`; do echo $d,`ls "$d" | wc -l`; done というコマンドをみつけて実行してみたのですが、 for: コマンドが見つかりません. d: 定義されていない変数です. というエラーとなってしまいます。 UNIX上のなにか制約があるのかどうかよく判りません。 どなたかなぜエラーが出るのかとこのコマンドを正常に実行する方法を教えていただけないでしょうか?

  • SQLSERVER2005 sqlcmd 実行時のエラー

    「sqlcmd -S computerA\instanceB -U userC -P passD -i inputfileE -o outputfileF」 を実行した際にoutputfileFに以下のエラーメッセージが出力されていました。 「Sqlcmd: エラー: Microsoft sql native client: サーバー接続のオープン処理の遅延のため、ログイン プロセスを完了できませんでした。」 このコマンドは数ヶ月前から毎日行っているもので、今日始めて出力されました。 原因を調査しましたがわからなかったため、とりあえず同じコマンドを再実行したところ、今度は正常に動作しました。 本メッセージの出力原因を教えてください。 よろしくお願いします。