Cプログラムでpopen関数?を使用しコマンド(rcp)を実行するプログ
ラムを造ったのですが、当分が動作していたのですが、何のタイミングか分からないのですが、失敗する時が有ります。一度失敗するとそれ以降はずーと失敗します
。どのような原因が考えられるのでしょうか?
ちなみにプログラムの一部をとりあえずのせておきます。(ファイル名及び相手先
のディレクトリ名は現状存在します)
又、system関数とpopen関数の大きな違いは何でしょうか?
ご教示お願い致します。

(cプログラムの一部)

char buff[256] ;
char cmnd[256] ; /* コマンド文字列 */
int fp_rtc ;

memset( buff, NULL, sizeof(buff) ) ;
memset( cmnd, NULL, sizeof(cmnd) ) ;
strcpy( buff, argv[1] ) ;

sprintf(cmnd, RCP_FMT , buff, RCP_DIR, buff ) ;
printf( "rcp cmnd ( %s )\n", cmnd ) ;

fp = popen(cmnd, "r") ;
fflush(stdout) ;
fp_rtc = pclose(fp) ;
if ( fp_rtc != 0 ){
printf( "pclose err [ rtc:%d ] \n", fp_rtc ) ;
}

A 回答 (5件)

どうもどうも。


え~とですね。fflush()は出力バッファにたまっているデータを吐き出すための関数ですよね。
ところが、今回のケースでは、popen()を読みこみ用に使っています。ですからfflush()は関係ありません。
(ご質問のプログラムではfflush()の引数をstdoutとしていますが、なおのこと、これはpopen()の返した
fpとは何の関係もありません。)
親プロセス側でfflush()が呼ばれても、子プロセス側でfflush()が実行されるものでもありません。
    • good
    • 0
この回答へのお礼

いろいろとアリガトウございました。また、なにか有った時は宜しくお願い致します。

お礼日時:2001/12/04 23:16

まずお詫びをしなくてはいけません。


私の思い違いで、間違ったことを書いてしまいました。
pclose()は、子プロセスの終了ステータスを返します。
ですから、この扱い方については、hiropopさんの元の
プログラムで良かったのだと思います。
というわけで、
> pcloseの戻り値と言うのは、変数fpを使用して何か実行した
> 結果(ここでは関数fgetの結果)のことでしょうか?
ということではありません。

> 何も実行せずpcloseを行うとpcloseの戻り値はエラーになる
> (可能性がある)と言うことでしょうか?
一応その通りなのですが、誤解があるといけませんので、もう少し説明して
おきます。実のところ、もし子プロセスが何も出力せずに終了しているのなら、
fpを使って何かを読み出すという処理は全く必要ありません。(もっとも、
その場合はpopen()を使う必然性がないことになりますが。)問題は、
親プロセスがpclose()を使ってパイプを閉じた後、子プロセスがその
閉じられたパイプに何かを出力しようとした時に起こります。その場合、
No.2でも書きましたが、「閉じたパイプに書き込んだ(SIGPIPE)」という
エラーが起こり、子プロセスは強制終了されます。その情報がpclose()の
戻り値として返されるわけです。

この回答への補足

ありがとうごさいます。が、いまいち動きがつかめていないようで、悩んでいます。いろいろと教えて頂いて恐縮しています。
今回のpopen()-pclose()の間にffush()関数を使用したとしても、全然読まれないままpcloseされてしまうとゆうことでしょうか?
お忙しいのに、覚えが悪く申し訳ございません。もうすこし教えて頂けないでしょうか?

補足日時:2001/11/30 20:02
    • good
    • 0

ご無沙汰しました。



> 「全然読まないままpclose()している」と有りますが、どうゆうことでしょうか?

fp = popen(cmnd, "r") ;
として、popen()の戻り値を変数fpに入れていますよね。この値は子プロセスの標準
出力を親プロセスで読み取るために使われます。
例えばこんな感じです。

char buff2[256];
fp = popen(cmnd, "r");
while (fgets(buff2, 256, fp) != NULL) {
 /* buff2 を使う処理 */
}
if (pclose(fp) < 0) {
 printf("pclose err [errno:%d]\n", errno);
}

この回答への補足

いろいろとありがとうございます。

確認ですが、pcloseの戻り値と言うのは、変数fpを使用して何か実行した
結果(ここでは関数fgetの結果)のことでしょうか?
又、何も実行せずpcloseを行うとpcloseの戻り値はエラーになる
(可能性がある)と言うことでしょうか?
すみませんが教えて下さい。宜しくお願い致します。

補足日時:2001/11/29 14:58
    • good
    • 0

pclose()が子プロセスをkill()するというterra5さんの回答は、必ずしも


すべてのシステムでの仕様ではありません。少なくとも、私の手元にある
Vine Linux ではpclose()は子プロセスをwait4()することになっています。
(むしろ、私はterra5さんの仰るようなシステムに心当たりがありません。)
で、ご質問のプログラムでは、子プロセスの出力を親プロセスが読み取れる
ようにして起動しているわけですが、全然読まないままpclose()しています。
この場合、子プロセス側は「閉じたパイプに書き込んだ」というエラーに
なる可能性があります。
pclose()はエラーの場合、常に-1を返します。エラーの内容を知りたい時は
#include <errno.h>
とした上で、extern宣言されているint型変数errnoの値を読み取りましょう。

余談ですが、system()およびpclose()はシェルを起動して、コマンド列を
渡します。従って、コマンド列の最後に'&'をつけておけば、system()でも
コンカレントな実行が可能です。

この回答への補足

ありがとうございました。

又、下記質問が有ります。宜しくお願い致します。

>全然読まないままpclose()しています。
この場合、子プロセス側は「閉じたパイプに書き込んだ」というエラーに
なる可能性があります。

「全然読まないままpclose()している」と有りますが、どうゆうことでしょうか?
御教示お願い致します

補足日時:2001/11/26 13:45
    • good
    • 0
この回答へのお礼

ありがとうございました。

又、下記質問が有ります。宜しくお願い致します。

>全然読まないままpclose()しています。
この場合、子プロセス側は「閉じたパイプに書き込んだ」というエラーに
なる可能性があります。

「全然読まないままpclose()している」と有りますが、どうゆうことでしょうか?
御教示お願い致します。

お礼日時:2001/11/26 10:44

>system関数とpopen関数の大きな違いは何でしょうか?



systemは指定されたコマンドを実行するプロセスを生成し、完了するまで呼び出したほうはwait状態になります。
popenはどちらのプロセスも動作状態になります。
また、popenされた場合標準入出力がpopenの戻り値である
FILE *にリダイレクトされていますが、systemは元と同じものを使用します。
また、pclose()でプロセスがまだ実行中の場合はkillされます。

質問のプログラムだと、systemを使うべきで,
popenを使うのは変に思えますが。
popenは本来プロセス間でファイルi/oによる同期処理が必要な場合に使うものですから。

systemだとwaitするから嫌だと言う話なら,forkしてexecするべきでしょう。

不調の原因はプロセスが完了する前にpcloseしているかららも知れません。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2001/11/26 11:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QNULLとは?

C言語でNULLって言葉が頻繁に出てくるのですか?
NULL=値がない
という理解で大丈夫ですか?

Aベストアンサー

一般的にはOK。
ただC言語においては、「値がない」ってのは、ちょっと違うかと。

大雑把な言い方だと、無効なポインタ(メモリアドレス)を表現する特殊な値ってところ。
本当の定義は規格書を参照。
http://www.jisc.go.jp/app/pager?id=10758

Qverilog HDLの[=]と[<=]の使い分け

現在Verilog HDLを勉強しており、ひと通り勉強は終わりました。
しかしブロッキング代入[=]とノンブロッキング代入[<=]の使い分けをどこまで暗記すれば良いのか分かりません。
皆様は、[=]と[<=]の使い分け、あるいはネット型、レジスタ型への代入をする際の区別をどのように暗記していますか?「このポイントを理解すれば大丈夫!」みたいなことを教えていただけると助かります。

今思いつく例としては↓のとおりです
・assign文では[=]を使用しなければならない。
・assign文の左辺は[ネット型]のみ
・case文のHPによって[=]を使用しなければならない。
・ http://veri.jp/ba_nba.html のHPの最後のほうで『ほかにも「assign 文では NBA "<=" が使えません」という誤った注意書き』と書いてありますが、この記述の意味がわかりません。
・回路記述ではダメなのに、シミュレーション記述では問題がない等等、、、
他にもfunction文やalways文の中で式を書く時にも困っています。

Aベストアンサー

> http://veri.jp/ba_nba.html
こんな良い解説ページを見つけたのに、なぜ質問しているのかがよく分かりませんが・・・。

まずassign文は継続的代入であって、ブロッキング代入でもノンブロッキング代入でもないので、
ブロッキング代入とノンブロッキング代入の使い分けという議論の対象外です。

また、ブロッキング代入とノンブロッキング代入はレジスタ型に対して使う、
継続的代入はネット型に対して使う、
となるため、型でブロッキング代入とノンブロッキング代入の使い分けなんて言う議論は最初からできないです。(どちらもレジスタ型が相手だから)


解説ページにも書かれていますが、
ブロッキング代入とノンブロッキング代入の違いは、
"右辺の評価" と "左辺への代入" が同時に行われるか、別々に行われるかの違いです。

たとえば、
a = x;
b = a;
としたとき普通のプログラミング言語のように、bもxになって欲しいなら、ブロッキング代入を使いますし、
bにxが代入される前のaの値が入って欲しいなら、ノンブロッキング代入を使うことになります。


always文でFFを生成するときは、その時刻においては代入前の値を参照したい(実際の回路を考えると代入後の値を参照できるのは次のクロックがやってきたときだから)ので、
ノンブロッキング代入を普通は使いますね。
(ブロッキング代入だとレーシング=記述順序で結果が変わってしまうという問題があるというのもありますが。)

それ以外(組み合わせ論理を作るalways、function、シミュレーション記述)は、
特に理由がなければブロッキング代入を使っています(変数を直ちに更新して欲しい場合がほとんどだから)が、
前述のノンブロッキング代入の挙動を理解した上でノンブロッキング代入が必要だと思ったなら
使っていけないわけではないです。

> http://veri.jp/ba_nba.html
こんな良い解説ページを見つけたのに、なぜ質問しているのかがよく分かりませんが・・・。

まずassign文は継続的代入であって、ブロッキング代入でもノンブロッキング代入でもないので、
ブロッキング代入とノンブロッキング代入の使い分けという議論の対象外です。

また、ブロッキング代入とノンブロッキング代入はレジスタ型に対して使う、
継続的代入はネット型に対して使う、
となるため、型でブロッキング代入とノンブロッキング代入の使い分けなんて言う議論は最初からでき...続きを読む

QNULLS FIRSTとは、どのバージョンから使えますか?

ORDER BY 句で、NULLS FIRSTは、ORACLEのどのバージョンから
使えるようになった機能ですか?

Aベストアンサー

8.1.6以上です

Q[TeX,DVI,PS,PDF]

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command PSfile (ps:) failed.
** WARNING ** >> at page="17" position="(178.298, 728.302)" (in PDF)
** WARNING ** >> xxx "PSfile="421.eps" llx=16 lly=22 urx=797 ury=986 rwi=7810 "

●GSViewはEncapsulated Postscriptの仕様で定義された「一行が255文字以下」を満たしていないという理由を掲示した上で表示してくれたが、dvioutでは画像は表示されなかった。

●EPSファイルは、VisioのオブジェクトをAdobe Distiller Jにかまして作られたものだと思われる。
ここでエラーが出るせいなのかわからないが
このEPSファイルが貼り付けられたTeXファイルをコンパイルしたDVIではすべて前にある画像(JPEGをjpeg2psでPSに変換して作成)となっている。

こうして出来た(?)dviファイルをdvipdfmxに通して作られたPDFではそれらの画像(同様の方法を用いて作られたPSファイルを含む)は表示されているが、該当エラーが発生した画像は表示されなかった。

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command P...続きを読む

Aベストアンサー

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなのでしょう.
(注意:gsで変換できないのと表示できないは別のことです
gsで表示できるものが他の形式に変換できるかは別問題です)

visio由来のEPSはいろいろと問題を起こします.
大抵の場合はフォント周りで問題が発生します.

Ditillerをお持ちならdvipdfmxを使わなければ
うまくいくかもしれません

もしかするとghostscriptのバージョンをあげたりすると
うまくいくかもしれませんが・・・根本的には
EPSそのものを修正するしかありません.

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなの...続きを読む

QNULLポインタが0でない処理系とは?

http://oshiete.goo.ne.jp/qa/7458540.html にて、
> C言語の規格上、0はNULLポインタとして扱われますが
> NULLポインタは0とは限らないので(0でない処理系もあります)。
と他の回答者が答えていたのが妙に引っかかりました。

後学のために知っておきたいのですが、
どの処理系だとNULLポインタが0ではないのかどなたかご存じないですか?


気になって、C99の仕様書らしいものを検索で見つけたのですが、
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
これによると、6.3.2.3 Pointers の 3節 にて、
> An integer constant expression with the value 0,
> or such an expression cast to type void *, is called a null pointer constant.
とあり、7.17 Common definitions <stddef.h> の 3節 でも、
> The macros are
> NULL
> which expands to an implementation-defined null pointer constant; (略)
とあるので、NULLポインタを表す定数は0か(void*)0だと思っていたのですが。

言い換えると、
struct foo {
char* bar;
};
と構造体が定義されている時、
struct foo baz;
bzero(&baz, sizeof(baz));
すればbaz.barはNULLポインタ定数に初期化されると思っていたのですが、
これだとダメな処理系はどういう処理系で、どんな用途で使うのでしょうか?
おそらく、0でない値にした目的や歴史的経緯があるのではないかと推測するのですが。

http://oshiete.goo.ne.jp/qa/7458540.html にて、
> C言語の規格上、0はNULLポインタとして扱われますが
> NULLポインタは0とは限らないので(0でない処理系もあります)。
と他の回答者が答えていたのが妙に引っかかりました。

後学のために知っておきたいのですが、
どの処理系だとNULLポインタが0ではないのかどなたかご存じないですか?


気になって、C99の仕様書らしいものを検索で見つけたのですが、
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
これによると、6.3.2.3 Pointers の 3節 ...続きを読む

Aベストアンサー

日本語訳版
http://www.kouno.jp/home/c_faq/c5.html

C FAQ、最近は読まれないのかなぁ

Qruby "\001\376".unpack("C*") => [1, 254]の意味

"\001\376".unpack("C*") => [1, 254] の
[1, 254]ってどういう数字を意味するのですか?8ビット整数なのに配列で結果が出ていることの意味がわかりません。ご教授ください。

Aベストアンサー

"\001\376"
は、バイナリ文字列で
"C*"

バイトとして数値を取り出し配列にする
ということだと思います。
\376は、8進数で、10進にすると254になります。
見当違いだったらすみません。

QNULLとは?

NULLとは?

ウインドウズライブメールのツール→アカウントを開くと
以下のようになっていますが、このか?Active Directory NULL (←薄いグレイの文字)
とは何でしょうか?

メール---------------
(絵)●●●●●●(既定のアカウント)
   ●▲●■●●nifty.com

ニュース---------------
(絵)マイクロソフトコミュニティ(既定のアカウント)

ディレクトリサービス---------------
(絵)Active Directory           ★
   NULL (←薄いグレイの文字)

(絵)Veri Sign インターネットディレクトリサービス

Aベストアンサー

NULLとは数字の0と同じ意味です。
つまり、Active Directory サービスは使用していません

という意味になります。

Q[bash]printfコマンドについて

以下のシェルスクリプトを作成しています。

echo -n "開始> "
read START
echo -n "終了> "
read END
echo -n "桁数> "
read DIGIT
x=$(seq ${START} ${END})
y=$(printf "%06d\n" $x)
echo $y

上のとおり、現在は6桁固定になっておりますが、最終的には"桁数"で取得した値となります。

どのように修正したらいいのでしょうか?

ご回答をお待ちしております。

Aベストアンサー

直すとしたら、以下のようでしょうか。

#!/bin/bash -e
echo -n "開始> "
read START
echo -n "終了> "
read END
echo -n "桁数> "
read DIGIT
for x in $(seq ${START} ${END})
do
printf "%0*d\n" DIGIT ${x}
done

QビルダーV.10で”Nullまたはオブジェクトではありません”とは?

 どちらかと言えばjavaScriptnoの問題かもしれませんが、全く同じ計算フォームを左右に2個並べましたが、
計算ボタンをクリックした時左は問題なく右のみタイトルで書いたエラーが出ます。
<!--
function func2() {
m=eval(document.frm.m.value);
n=eval(document.frm.n.value);
o=eval(document.frm.o.value);
p=eval(document.frm.p.value);
q=eval(document.frm.q.value);
r=eval(document.frm.r.value);
s=(Math.ceil(Math.ceil((o*q/2+150)/n)*n*2/100)/10);
t=("");
if((p>m-350)&&(r>0)){
t=0.4
}
z=s+t
document.frm.z.value =z;
}
//-->
<body>
<INPUT type="button" value="計算" onclick="func2()">
</body>

この最初のm=eval(documet.frm.m.value); に上記のエラーが出ます。
左側をコピーしてフォーム名を変えただけですが、どこを直したらいいのでしょうか。詳しい方のご回答お願いいたします。

 どちらかと言えばjavaScriptnoの問題かもしれませんが、全く同じ計算フォームを左右に2個並べましたが、
計算ボタンをクリックした時左は問題なく右のみタイトルで書いたエラーが出ます。
<!--
function func2() {
m=eval(document.frm.m.value);
n=eval(document.frm.n.value);
o=eval(document.frm.o.value);
p=eval(document.frm.p.value);
q=eval(document.frm.q.value);
r=eval(document.frm.r.value);
s=(Math.ceil(Math.ceil((o*q/2+150)/n)*n*2/100)/10);
t=("");
if((p>m-350)&&(r>0)){
...続きを読む

Aベストアンサー

これだけではよく分かりませんが、
コピーしたので同じ名前(変数名など)になっているところがあるからではないでしょうか?

QTO_CHARで小数点以下がある場合と無い場合を切り分ける方法

お世話になります。

基本的なことだと思うのですが、調べても見つけられませんでした。
わかる方教えて下さい。

現在
to_char(SUUJI,'FM9999999999990.9999999999999')

         表示
SUUJI = 10 → 10
SUUJI = 10.1 → 10. ( . が残ってしまう)

小数点以下がある場合は XXXXX.XXX
小数点以下が無い場合は XXXXX

出来るでしょうか?

Aベストアンサー

こんにちは。

>使用しているのはPL/SQLです。
やっとわかりました・・・。

rtrim(to_char(SUUJI,'FM9999999999990.9999999999999'),'.')
ですね。
(^^ゞ


人気Q&Aランキング