>>3114 68user ご回答ありがとうございました 大変助かりました さて、findコマンドでファイルを検索をかけていますが 大きいファイル順に並べ替えるなど そのようなことはできないでしょうか? |
C言語のプログラムでsystem関数でプログラムを呼び出します。 引数に存在しないプログラムを指定した場合のsystem関数の戻り値が-1になる時と256になる時があります。 256の時は、上位8ビットが1なのでシェルのexitコードが1のような気がするのですが、何も環境を変えていないのに戻り値が-1や256に変わる理由が思い浮かびません。 何度も繰り返していると-1と256が不規則に交互します。 この情報だけで何か分かりますでしょうか。 よろしくお願いします。 |
>>3121 Japper > さて、findコマンドでファイルを検索をかけていますが > 大きいファイル順に並べ替えるなど 大きいってファイルサイズのことですか? もしそうなら find . -ls | sort +7 とか。 >>3122 koko > system関数の戻り値が-1になる時と256になる時があります。 FreeBSD の system(3) がおっしゃるには The system() function returns the exit status of the shell as returned by waitpid(2), or -1 if an error occurred when invoking fork(2) or waitpid(2). A return value of 127 means the execution of the shell failed. だそうです。 |
>>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 から 実行した場合は端末は割り当てられないので、それは不可能です。 で、あなたが本当は何をしたいかという話になるわけですが、コンソール (マシンにつながっているモニタ) に文字列を出したいんですか? あるいはファイルにあらかじめ入力文字列を書いておいて、ファイルに 出力したいんですか? |
>> 3147 68user >おそらく「端末」という用語を誤解されていると思いますが、cron から >実行した場合は端末は割り当てられないので、それは不可能です。 「端末」は、画面と入力が行える(ディスプレイとキーボード)と認識 してましたが間違っているでしょうか?また、cronに端末が割り当てら れないのは認識していましたが、何らかの方法で端末を割り当てるか、 リダイレクトなどで入出力できないものかと思って質問させていただき ました。 質問時には、コマンドラインでシェルを実行し確認したところ、 readのpromptが適切に表示できないなど若干問題があったので質問 させていただいたのですが、cronで”a.sh < /dev/pts/13 > /dev/pts/13 2&>1”を実行したところ正しく動作しているよう です。現在は、本当にこれでいいのか(コマンドラインではうまく いかなかったので)、動作で注意すべき点はないか(どのデバイス に出力すればよいか)悩んでいるところです。なにかアドバイスが あればよろしくお願いします。 >で、あなたが本当は何をしたいかという話になるわけですが、コンソール >(マシンにつながっているモニタ) に文字列を出したいんですか? コンソールに入力を促す文字列を出力し、ユーザからの入力を受け取り たいのです。(read INPUT?'?'を行いたい) UNIX汎用だとおもったので環境は書かなかったのですが、一応記述します。 NCRのUNIX V(らしい)でK Shellを利用しています。 よろしくお願いします。 |
>>3147 68user 68user さんありがとうございます!! system("mount /mnt/floppy"); system("ls /home"); など実現できました!! ありがとうございました。 |
>>3148 FF > cronで”a.sh < /dev/pts/13 > /dev/pts/13 2&>1”を実行したところ > 正しく動作しているようです。 ほー、FreeBSD で試してみましたが、これ、できるんですねぇ。 知りませんでした。ただ、出力はいいとして、入力については ちょうどそのときその端末デバイスからの入力を受け付ける プログラム (シェルとか) が走っていた場合、キー入力が そのプログラムに渡るか、a.sh に渡るかは不定 なような気がします (FreeBSD で試した限りでは、ですが)。 あとは - その端末を読み書きする権限があるかどうか (パーミッションの問題) - 誰もログインしていなかったらどうするか - 複数の端末があった場合は who などで調べるとしても、 どの端末を選べばいいのか - (ウィンドウシステムがあるとして) たまたま選んだ端末がウィンドウの 後ろに隠れていたら とかいろいろ問題ありげなので、お勧めはしません。 |
「ネットワークプログラミングの基礎知識」の「リンク集・参考書籍」 http://x68000.startshop.co.jp/~68user/net/link-book.html にちょろっと追加しました。 # http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/link-book.html |
>>3150 68user 68userさんご返答ありがとうございます。 >ちょうどそのときその端末デバイスからの入力を受け付ける >プログラム (シェルとか) が走っていた場合、キー入力が >そのプログラムに渡るか、a.sh に渡るかは不定 最初のreadの受け取りで若干おかしな動作をする(シェルのプロ ンプトが表示される)ようなので、cronを使わず常駐して時間に なったら動作するようにしました。 ありがとうございました。 |
内容あやしげ、そして需要がほとんどないと思われる 「DNS クライアントを作ってみよう」 を書きました。 http://x68000.startshop.co.jp/~68user/net/resolver-1.html http://x68000.startshop.co.jp/~68user/net/resolver-2.html http://x68000.startshop.co.jp/~68user/net/resolver-3.html 3連休つぶれちゃったよ。とほほ。 |
お世話になります。kakiです。 現在、LAN経由でクライアントから送られてくる(55msec毎)データを、 取得し、表示するHTTPサーバーを作成しています。 サーバー側で、クライアントと接続中にLANケーブルが抜けたのを 検出するのに、受信ループ中のping()で戻り値を判断して、 抜けているかどうかを判断しようとしていますが、 この方法は正攻法なのでしょうか? また、その方法を試そうと思ったのですが、 accept()後のrecv()で受信待ちをしてしまっている為、 ケーブル断が検出できていません。 受信待ちをしないよう、socket()後にfcntl(s,F_SETFL,O_NONBLOCK)と しているのですがrecv()でとまっているようです。 fcntl()の使い方が間違っているのでしょうか? |
>>3154 kaki > この方法は正攻法なのでしょうか? 正攻法とは何かという話になってしまいますが、TCP/IP の設計思想的には 誤りです。ケーブルが抜けようがルータが落ちようが、その部分が復旧したら 元通りに通信できるべきである、という考えだからです。 と言っても、タイムアウトを実装したいというケースもあるでしょうが、 わたしなら select したり non-blocking socket 使うと思います。ケーブル 断だけでなく、クライアント側のバグなどで いつまでたっても反応がない 場合なども対応できるからです。 サーバ側のケーブル断であれば >>1301 rosegarden という話もあったりしますが、通信できない原因はたくさん考えられるのに、 なぜサーバ側のケーブル断だけ特別扱いするのか、という話になるのではないかと。 > 受信待ちをしないよう、socket()後にfcntl(s,F_SETFL,O_NONBLOCK)と > しているのですがrecv()でとまっているようです。 > fcntl()の使い方が間違っているのでしょうか? non-blocking socket を使ったことがないのでわかりませんが、あってる ような気がします。 多分これは関係ないでしょうけど、とりあえず int val = fcntl(s, F_GETFL, 0); fcntl(s, F_SETFL, val | O_NONBLOCK); の方がいいでしょうね。 |
質問です。Windows のDOS窓で 0x01〜0x06、0x10、0x15〜0x17 で水道管みたいな罫線が出たり、 0x12、0x1b〜0x1fでちっちゃな矢印が出ますが、 これらの文字は誰がどこで決めたのでしょうか。 おわかりでしたらご教示ください。 |
>>3156 ふくし 調べましたが、わかりませんでした。 http://czyborra.com/charsets/codepages.html を見るに、 > 0x12、0x1b〜0x1fでちっちゃな矢印 は CP437 あたりだと思いますが、なぜ 0x01 で 0xC9 な 水道管が出るのかはわかりません。 http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcode/ で質問してみてはどうでしょうか。 |
>>3157 68user さん、ありがとうございます! 聞いてみます。 ちなみにDOS窓でjpとやると出てくる字から想像するに、 CP932ですよね。 usとやると437に切り替わりますが、そうすると出てくる字は 下で出てきたCP437そのままのようです。 |
たまに referer 見てみると、知らないところで突っ込まれて たりするのでおもしろい。 http://dns.qmail.jp/lies.html > コンテンツサーバとキャッシュサーバの違いを理解していな可能性が高いから。 うっ。勉強しよう。 |
お世話になります。 gcc(全般)でコンパイルした実行ファイルには チェックサムは付加されているのでしょうか? |