|
>>3123 68user 確かに、私が調べたところでも同じ事が記述されていました。 試しに簡単なmainを作って存在しないコマンドをsystemで呼び出すとsystemの戻りは256(おそらくシェルの返すexitコード=1)だけでした。 -1は戻りませんでした。 256と-1が交互になるのは何か他の原因かもしれません。 もう少し調べてみます。 ありがとうございました。 |
|
>>3124 koko 256と-1が交互になる件は解決しました。 SIGCHLDのシグナルハンドラを登録してあった為、シグナルハンドラが割り込んだ時のみsystemの戻り値が-1になっていた様です。 SIGCHLDをマスクしたところ、戻り値は256で安定しました。 |
|
find コマンドについて質問があります。 ファイル名で検索をかけたいと思うのですが、 UNIXだと英数字の大文字・小文字を区別してしまうので、例えば、 「a」で検索した場合、「A」というファイルは引っかからないかと 思います。 大文字・小文字の区別無く引っ掛けたいと思うのですが、その様な オプション又は方法はありますか? |
|
>>3126 bebe 最近の *BSD find や GNU find なら -iname とか -iregex とか。 そうでない find なら広めにひっかけて grep で絞りましょう。 |
|
>>3127 68user findコマンドで引っ掛けられたらいいかと思ったのですが、 やっぱり広めに検索をかけて、grep等で絞り込むしかなさそ ですね。 参考になりました。 有り難うございます。 |
|
始めまして、いつもこちらでは陰ながら勉強させていtだいてます。 perlスクリプトのことでお教えください ただ今企画中のスクリプトにおいて 外部コマンド実行時、そのコマンドプロセスの標準入力へ有る意味大量のデータ(文字列)を渡したいのです しかしこの方法が全く頭に浮かばず情け無い状態であります! PIPEやファイルシステムの基礎を知らない私にご教授下されば幸いです。 |
|
>>3129 もも open(OUT, "| command"); print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE...."; close(OUT); ってことですか? じゃなくて command の標準入力に渡しつつ、そのコマンドの 出力を受け取りたいなら IPC::Open2 などを使えばできます。 できますが、デッドロック回避などが面倒なので open(OUT, "| command > file"); print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE...."; close(OUT); open(IN, "< file"); while (<IN>){ .... } でいーんではと思う軟弱な私。 |
|
>>3139 金床 68user様なるほど理解しました前者が出来ればいいのです! 早速試してみます。ありがとうございました! |
|
親プロセスが複数の子プロセスを生成します。 親は子プロセスの終了をシグナル(SIGCHLD)ハンドラで検知し、waitで子プロセスの終了コード(exitの引数)を取得しています。 同時に、子プロセス数を減算します。(forkで子プロセス数を加算しています。) シグナルハンドラの処理中に、別の子プロセスが終了した場合、SIGCHLDが無視されてしまう。 あるいは、ほぼ同時に複数の子プロセスが終了した場合には、1回しかSIGCHLDのシグナルが発生しないとの記述を見た事があるのですが、正しく全ての子プロセスの終了を検知する方法はありますでしょうか。 以前、頂いたNo. 2988で頂いた以下の方法でこのような懸念が解消されますでしょうか。 SIGCHLDのシグナルハンドラ-------------------------- int pid,status,code; while((pid=waitpid(-1,&status,WNOHANG))>0){ if(WIFEXITED(status)){ code = WEXITSTATUS(status); } } -------------------------------------------------- また、waitpidがシグナルに割り込まれるとエラーになり、errnoにEINTRが設定されると思うのですが、WNOHANGを設定していた場合にはそのような事は無いと考えてしまって良いでしょうか。 よろしくお願いします。 |
|
>>3132 koko まずは sigaction(2) を読んでください。 # わたしもよくわかってないので読んでいるところ。 |
|
>> 3133 読んでみます。 |
|
ソケット(TCP)に関する質問です。 サーバ(UNIX)とクライアント(WinSock)がソケットで通信しています。 サーバがクライアントに対してwriteでデータを送り、クライアントがrecvでそれを読む処理を作成しました。 サーバでwriteし、すぐにソケットそcloseすると、クライアントではrecvできずにエラーになります。(既に接続が破棄されている。) サーバ側でwriteして、すぐにcloseしている事が原因の様です。 writeとcloseの間に1秒程度の時間をおくと、クライアントはrecvできました。 このように、writeとcloseが連続すると相手がrecvできないケースは当然の事なのでしょうか。 それとも、通常はrecvできるはずであり、他に問題がありそうでしょうか。 同じ経験をした事のある方がの意見なども聞けると助かります。 よろしくお願いします。 |
|
>>3135 koko > 通常はrecvできるはず だと思います。 |
|
>>3136 68user 回答ありがとうございます。 他の原因を調べてみます。 |
|
ファイルハンドルについての質問です。 Net::FTPで動的に作り出したCSVをアップしたいのですが、 ローカルにファイルを書き出さずにputする方法を教えてください。 FileHandle.pmを使って無名のファイルハンドラを作って、 そこにCSVを入れて、$FTP->put(FILEHANDLA)でアップさせる とイメージしているのですが よろしくお願いします。 |
|
>>3135 koko ソケットのクローズはどのAPIを使って(どんなソースコードで)行ってらっしゃいますか? Winsockだと、shutdownを使わずにclosesocketを呼ぶとRSTフラグのセットされたパケットが飛ぶことが あるような覚えがあります。 いずれにせよ、パケットキャプチャしてみると原因に近づけると思います。 |
|
>>3139 金床 パケットをキャプチャしてみたところ、サーバからクライアントにRSTフラグのセットされたパケットは飛んでいました。 試したケースを整理します。 (1)accept直後にクライアントからの送信データをreadせずに、サーバ側から write、closeすると、クライアントではサーバがwriteしたデータを受信できません。 (2)accept直後にクライアントからの送信データを1バイトでも良いのでreadし、サーバ側からwrite、closeすると、クライアントではサーバがwriteしたデータを受信できます。 (2)では、RSTフラグのセットされたパケットが飛ぶ前に、FIN ACKがセットされたパケットとクライアントで受信させたいパケットが飛んでおり、(1)ではFIN ACKがセットされたパケットとクライアントで受信させたいパケットが飛んでいません。 サーバ側でクライアントの送信電文を1バイト読む事で動きが変わるようなのですが、この辺が何か関係があるのかもしれません。 ちなみに、APIは以下の通りです。 サーバ(UNIX):socket,bind,listen,accept,select,read,write,close クライアント(WIN):socket,bind,connect,listen,recv,send,closesocket サーバ側でのソケットのクローズは、acceptの戻り値を引数にしてcloseをしているのみで、shutdownはしていません。 |
|
>>3138 ajmj > FileHandle.pmを使って無名のファイルハンドラを作って、 > そこにCSVを入れて、$FTP->put(FILEHANDLA)でアップさせる というのが実現可能なのかどうかはわかりませんが (できない ような気がする)、別解としては 1. put じゃなくて stor("ファイル名") を呼ぶと、Net::FTP::dataconn オブジェクトが返ってくるので、それに対して write する。 2. POSIX::mkfifo で名前付きパイプを作り、fork して、 子が CSV データを作成、名前付きパイプに書き込む。 親は Net::FTP::put に名前付きパイプを渡す。 あたりですかね。1 は perldoc Net::FTP を流し読んだだけで、 できるかどうかわかりません。2 は試していませんが、一応実現は できるでしょう。 >>3140 koko http://www.kt.rim.or.jp/~ksk/wskfaq-ja/newbie.html#howclose ですかね? あと、情報を小出しにせず、最小限まで削ったソースコードを最初に 載せれば、話が早そうなのになぁと思ったりします。 まぁわたしは Winsock 知らないのでアレですが。 |
|
はじめまして、お世話になります。 kakiと申します。 現在、Linux(Redhat7.1 kernel2.4.2-2)、C言語にて プログラムの作成をしております。 質問なのですが、プログラム上(C言語)からFD、CFなどのデバイスに マウントし、FD、CF内のファイルを取得するということは 可能なのでしょうか? お分かりになる方がおられましたら、ご教授お願いいたします。 |
|
>>3140 koko やっぱりRSTによる「異常終了」が原因のようですね。 shutdown()を使ってみると幸せになれると思います。 |
|
>>3142 kaki mount(2) をどうぞ。あるいは DOS フォーマットならば mtools の mtype あたりがお手軽かも。 ところで CF って何ですか? コンパクトフラッシュ? |
|
>>3144 68user ご回答ありがとうございます。 mountはコンソール上でのやり方は知っているのですが、 gccでコンパイルしたプログラムからも、 使えるということなのでしょうか? また、コンソールで使えるコマンド(# mountや# cdなど)を Cプログラムで使用するにはどのようにするのでしょうか? 実際、やりたいことはプログラムを起動したら、 FD、CF(コンパクトフラッシュ)にマウントし、 ファイルがあればディレクトリにコピーするといったことです。 参考になるサイトや文献などご存知でしたら、 教えてください。 よろしくお願いします。 |
|
端末の入出力について質問です。 cronで実行されたシェルの出力を端末に出力したり、 端末からの入力を受けたりしたいのですが、どのよう にすればよいのでしょうか? 次のようなやり方ではダメでした。 #ファイル名 a.sh #!/bin/ksh while [ : ] do read INPUT?'?' if [[ $INPUT = 'q' ]]; then exit fi done #スクリプト終了 % a.sh < /dev/pts/13 > /dev/pts/13 2&>1 どなたか教えてください。よろしくお願いします。 |
|
>>3145 kaki > mountはコンソール上でのやり方は知っているのですが、 > gccでコンパイルしたプログラムからも、 > 使えるということなのでしょうか? mount(1) は内部で mount(2) を呼んでいるだけなので、自分で mount(2) を呼んでやればよいわけです。 mount(1) のマニュアル http://www.linux.or.jp/JM/html/util-linux/man8/mount.8.html mount(2) のマニュアル http://www.linux.or.jp/JM/html/LDP_man-pages/man2/mount.2.html セクションとは? http://www.linux.or.jp/JM/section.html > また、コンソールで使えるコマンド(# mountや# cdなど)を > Cプログラムで使用するにはどのようにするのでしょうか? system(3) を使います。 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/system.3.html なお、cd は海より深い理由により、system(3) からは使えません。 chdir(2) を自分で発行してください。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/chdir.2.html >>3146 FF > cronで実行されたシェルの出力を端末に出力したり、 > 端末からの入力を受けたりしたいのですが、 おそらく「端末」という用語を誤解されていると思いますが、cron から 実行した場合は端末は割り当てられないので、それは不可能です。 で、あなたが本当は何をしたいかという話になるわけですが、コンソール (マシンにつながっているモニタ) に文字列を出したいんですか? あるいはファイルにあらかじめ入力文字列を書いておいて、ファイルに 出力したいんですか? |