|
初めまして。 現在UNIXでのSocket通信プログラムを書いているのですが selectシステムコールとFD_ISSETマクロとの 関係がよくわからずにコードを書いていたところ バグに悩まされています。 select()を使いタイマで割り込み動作を監視しながら recv()で受信を行うというプログラムを書いています FD_ZERO( &fdset ); FD_SET( m_Sockfd, &fdset ); while(recv_size != 0) { work_fdset = fdset; ret = select( 64, &work_fdset, NULL, NULL, &time_out ); if( ret == -1) { 異常処理 } =============================== 割り込み監視 =============================== if( FD_ISSET( m_Sockfd, &work_fdset )) { data_size = recv( m_Sockfd, (void*)(m_pData + m_DataSize)) } m_DataSize += data_size; recv_size -= data_size; } ソースはだいたいこのような感じなのですが、 割り込み監視部分等でコネクションの切断 コネクションの再接続等を行っていると select()の返り値は0でタイムアウトなのですが FD_ISSET()マクロの方は返り値が真になってしまい recv()の発行を行うけれども実際はデータはきておらず recv()で処理がとまってしまい、割り込みの監視ができなくなって しまうというようなバグが発生しています。 ならばselectとFD_ISSETの返り値が真である場合にのみ recv()を発行すればよいと思うのですが なぜこういうケースがでるのかわからなければ 信用し得る修正にならないので書きこみさせてもらいました。 過去ログなどを検索して調べてみましたが 自分なりのなっとくいく回答がえられませんでした。 よければこういうケースになる条件、回避方法等 お教えいただければと思います。 |
|
追記ですが、下記のプログラムは 1ポート1コネクションのプログラムです |
|
>>1553 CoreFighter > CoreFighter さんへ。質問に対する回答をもらっても、 > 何の反応も示さないなら、質問するのはご遠慮下さい。 すいませんでした。以後気をつけます。 |
|
自己回答。先ほど質問を書きこんだものですが、 あれからいろいろサイトなどを再びまわって 間違いに気づきました。 お騒がせしました。 ようは 1ポート1コネクションなら select()の第一引数に取得したソケット記述子+1を指定すれば よかったんですね。 |
|
>>1590 mak(spriggan > 1ポート1コネクションなら select()の第一引数に取得した > ソケット記述子+1を指定すればよかったんですね。 ん〜、 ret = select( 64, &work_fdset, NULL, NULL, &time_out ); であっても、事前に FD_ZERO(&fdset); FD_SET(m_Sockfd,&fdset); してるんだから、select は m_Sockfd しかチェックしないと 思うんだけどなぁ…。 あと気になるのは、select が 0 を返したとき、FD_ISSET 得られる 値は有効な値なのかかどうか (select が 0 を返したときは FD_ISSET してはいけないのではないか)、ってところですけど、どうなんでしょう。 >>1586 YAGI > 現在サーバ間(UNIX/AIX)でNISの設定をしようとしています。 僕は NIS の設定をしたことがないので、ちょっとわかりません。 >>1582 たろ > マルチパートかシングルパートか、でした。失礼しました。 なるほど。で、 >>700 68user はどうでしたか。僕は multipart をばらすところまでしか やってませんので、(必要かどうかわかりませんが) 編集後に 再構成できるのかはわかりません。 # まぁ、できなくはないと思いますけれど。 >>1584 arche > 自分はPerl屋なのですが、ここほど為になるサイトは今まで > 見たことがありません。 どもです。ですが、http://www.din.or.jp/~ohzaki/perl.htm くらい 役立つレベルになりたいものです。 |
|
変な名前ですいません。 SystemVと呼ばれるOSがあるそうなのですが、 'システムブイ'か、'システムファイブ' どちらが正しい言い方なんでしょう? |
|
>>1592 バス酔いで思わずコアダンプ SystemIII の後継なので、システムファイブです。個人的には 話すときはシスブイと呼びますし、一応まわりには通じているようですが、 世間一般の人にシスブイと言ってわかってもらえるかは謎です。 # 検索すると http://www.system-v.org/ ってのが引っかかった。 |
|
>>1591 68user >はどうでしたか。僕は multipart をばらすところまでしか > やってませんので、(必要かどうかわかりませんが) 編集後に > 再構成できるのかはわかりません。 どうもです。 MIME-TOOLSのexampleを見て、今手探り中です。 一度、multipart をばらして、対象のテキストパートから数えた行数を 取得後、multipartをばらしていない本文より行数を取ろうと思います。 ばらしたものよりの再構成は、(むずかしそうなので)とりあえず避けます。 |
|
今課題で、UNIXにApacheを入れ、フリーの掲示板をダウンロードして とりつける課題をしています。 しかし、ウィンドウズで作られたperlのプログラムなので改行コード の違いからか、エラーが出てInternal Server Error が出ます。 ダウンロードしたプログラムをperlで動かしてみても Illegal character \015 (carriage return) at aska.cgi line 2. (Maybe you didn't strip carriage returns after a network transfer?) といった、エラーが出ます。どうしたらよいでしょう。 |
|
cronを実行していたのですが、 マシンの時間を修正した後、cronが実行されなくなりました。 何が原因か、どうすれば実行するようになるのか、 どうか教えていただきたいです。 |
|
cronを実行していたのですが、 マシンの時間を変更した後、 実行されなくなってしまいました。 どうしたらよいのでしょうか? |
|
>>1595 じゅじゅ > 今課題で、UNIXにApacheを入れ、フリーの掲示板を > ダウンロードしてとりつける課題をしています。 最近どうして こんな変なのばっかりわいてくるんだろう。 マルチポストする人はさようなら。 >>1596 クーロン > cronを実行していたのですが、 理由はわかりませんが、cron daemon を再起動するのがお手軽で しょう。特にサーバマシンに言えますが、なるべく時刻は date や ntpdate を使わず、xntpd などで設定しましょう。 |
|
はじめまして。 UNIXのことあんまり知らない初心者のものです。 先日TELNETが使えるレンタルサーバを借りたはいいけど、なんとその2週間後! TELMETが禁止に、、、ってことで、ついでにCORNTABも禁止に。。。 こんな悲しいことってアリッ!!?TELNETが使えるから借りたのに!!!ガビーーン! ・・・ぐちっぽくなってゴメンなさい。 そんなこんなで、質問をさせてください。 TELNETが禁止のサーバで、CRONTABみたいに定期的にパールスクリプト実行できるテクニックってありますか? よい方法を知っている方がいたら、なにとぞ教えてくださいませ☆ |
|
ごめんなさい、マルチポストの意味がよく わかりません。とりあえず、ご迷惑をおかけしたようなので 他のところへ聞いてみたいと思います。 もう来ませんので許してください。 悪気は一つもなかったんですから。 |
|
>>1577 rererenore >さようなら、断りなしにマルチポストする無礼なひと。 >>1595 じゅじゅ >> 今課題で、UNIXにApacheを入れ、フリーの掲示板を >> ダウンロードしてとりつける課題をしています。 >最近どうして こんな変なのばっかりわいてくるんだろう。 >マルチポストする人はさようなら。 本当に困っているから複数のサイトで質問しているだけで何が無礼なのか分かりませんが。 全てのレスに対してお礼を書けば問題ないと思いますが? 何に対してむかつかれているのか全然分かりません。 嫌なら掲示板のどこかに書いておけばいいと思いますが「使い方」の方にすら書かれてもいないようですし。 あなたの方がよほど無礼だと思いますが。 |
|
>>1586 YAGI氏 最近、AIXもNISもごぶさたしていますが。 AIXのコツは、「なんでもsmit」、なので、 > 私的にはNISの解除の方法がおかしいのかなと思っています。 > (1./etc/passwdを戻す、2.smitでNISを解除する) は、O.K.だと思います。 ただ、「/etc/passwdを戻す」はちょっと意味が取れません。 この「NISの解除」と言っているのは、「NISサーバをアップデートする前に、NISサーバを停止すること」の意味ですよね? だとしたら、その間、/etc/passwdをいじる必要はありません。 NISサーバ側の作業は、 1. smitでNISサーバを停止 2. smitでNISサーバのアップデート 3. smitでNISサーバの起動 NISは(確か)statelessなので、クライアント側は何もせずにサーバに繋げると思います(ぼくなら、ypcat passwdで確認します)。 しかし、まあ、AIXは色々あるので、ダメならクライアント側(ypbind)もsmitで再起動するしかないでしょう。 # 余談ながら、通(つう)はsmitではなく、tty版のsmittyを使います。 # 走る男が見たいから、という理由でsmit(X版)を使い続ける人もいますが。 # 分からない人向けへの補足。 # smitは、AIXのGUI設定ツールなのですが、Windowsで砂時計がでるような状況で、 # 走る男のアニメーションがあります。 # しかも、設定が失敗すると、男がこけます。 # AIXがSolarisより優れているのは、これだけ。 |
|
>>1600 じゅじゅ >>1601 rererenore あなたがたに欠けているのは情報を共有しようという精神です。 あなたがたは自分一人情報を得て満足かもしれませんが、 少なくとも僕は、あなたがたを助けるため *だけ* に わざわざ 時間を割いて、検索したりソース見たりして回答しているわけでは ありません。みんなで知恵を出しあって情報を共有するのが 掲示板を開設している第一の目的です。 たとえば僕は >>1595 じゅじゅ を読んで「それは ftp で ascii モードで転送してないからでしょう」と (実際はもっと長文) 投稿しようとしましたが、その前に http://www.parkcity.ne.jp/~chaichan/qanda/qa539.htm?01-01-17-09-06 を見たところ、同じ質問が書いてあり、 じゅじゅ [WriteDate : Thu Jan 18 16:56:31 2001] まで書きこんでありました。 すでに解決していたことを、僕はいちいち細かく解説しようとして いたわけで、全くの無駄な行為です。あなたがたは、他の掲示板の 全ての閲覧者に対して、よーいドンで競わせて、だれが早く回答 するか待っているようなものです。無礼な行為だとは思いませんか? 他の掲示板に書き込んで既に情報を得ているのに、親切な誰かが >>1577 rererenore を見て、いちから説明しようとするかもしれない。おかしいとは おもいませんか? 本当に緊急のトラブルで困っているなら、「申し訳ありませんが、 緊急の事態なので、こことこことここに書き込みました」と 一言添えて、最後には全ての掲示板で得られた情報をまとめて、 こういう結果になりました、とサマリを書き込むべきでしょう。 > 全てのレスに対してお礼を書けば問題ないと思いますが? ダメです。情報の共有化がされていない。情報が集まるのは あなたのところだけ。 > 嫌なら掲示板のどこかに書いておけばいいと思いますが「使い方」の > 方にすら書かれてもいないようですし。 こんなことは、ちょっと答える側の立場に立ってみればわかると 思いますが、いちいち書かないと理解できませんか。それとも 僕の主張自体が理解できませんか。 http://www.parkcity.ne.jp/~chaichan/qanda/qa579.htm?01-01-18-16-56 http://script.lovely.to/bbs/infolng.cgi?print+200101/01010026.txt http://script.lovely.to/bbs/infolng.cgi?print+200101/01010016.txt |