|
はじめに、flockについて質問した者です。 CGIをダウンロードした人にプロバイダ来たメールで、 やはり、「NFSがらみで、flockが利用不可能な状態」とのことでした。 CGIの方は、WIN95も考慮して、ロックファイルの有無で対処いたしました。 話は、変りますが、DNSサーバーについて知識として教えて下さい。 rlogin,ftp,telnetなどで、ホスト名を指定した時に、どのようにして、 DNSサーバーとやり取りをしているのですか? DNSサーバーはhttpみたいなデーモンが動いているですか?(私の買った本には、この辺書いていなかった) ちょっと、気になったので、よろしくお願い致します。 |
|
flock の件は後程。 > rlogin,ftp,telnetなどで、ホスト名を指定した時に、どのようにして、 > DNSサーバーとやり取りをしているのですか? rlogin/ftp/telnet などは、ユーザからホスト名を受け取ると gethostbyname(3) などを使って、ホスト名から IP アドレスを 得ようとします。 gethostbyname の内部では、ソケットを使って DNS サーバに アクセスします。で、DNS サーバは UDP の port 42 を listen していて (UDP だから listen という表現は変?)、 クライアントからの問い合わせに応じて IP アドレスを 教えたり、他の DNS サーバに問い合わせたり、見付から ないよと答えたりします。 こういう問い合わせを行う DNS クライアント (この例では gethostbyname) のことを resolver と言います。resolver は 概念的なもので、問い合わせを一手に引き受ける resolver サーバのようなものがあるわけではありません。ただのライブラリです。 なので、自分で外部の 42/udp にアクセスする DNS クライアントを 書く事もできます。 > DNSサーバーはhttpみたいなデーモンが動いているですか? UNIX 界で DNS サーバとして有名なのは bind です。 プログラム名は named。 # apache と httpd の関係と似ています。 |
|
> こういう問い合わせを行う DNS クライアント (この例では > gethostbyname) のことを resolver と言います。 いや、違うか。 res_query, res_search, res_mkquery, res_send, res_init, dn_comp などの DNS サーバへ問い合わせを行うライブラリ 関数群のことを resolver といいます。gethostbyname などは これらの関数を孫請けとして呼んでいます、かな。 # See resolver(3). |
|
回答ありがとうございます。 では、DNSクライアントとnamedデーモンが、 UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。 すっきりしました。 ありがとうございました。 |
|
はじめまして、gongoと申します。 いきなりで申し訳ありませんが質問があります。 私はXアプリケーションの勉強を始めたばかりなのですが XライブラリとXツールキットを用いたプログラムを書こうとして 行き詰まってしまいました。 と言いますのは、例えばXツールキットを用いて表示させた窓に Xライブラリを用いて直線を引いたりする方法がわかりません。 XDrawLine(XtDisplay(w),XtWindow(w),gc,x1,y1,x2,y2); といった感じでプログラムの中に書き込みますとコンパイルは できるのですが、実行させるときにXDrawLineのところで Segmentation faultで止まってしまいます。 本もいろいろと読みましたがどうにもうまくいきません。 作成途中のプログラムは以下のところにあります。 http://www.din.or.jp/~gongo/xtshirt.c(本体) http://www.din.or.jp/~gongo/color.dat(色の数値) どうか宜しくお願い致します。 |
|
> では、DNSクライアントとnamedデーモンが、 > UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。 その通りです。 > 例えばXツールキットを用いて表示させた窓に > Xライブラリを用いて直線を引いたりする方法がわかりません。 非常に興味のある分野なので答えたいのはやまやまなのですが、 Xt を触ったことがないのでわかりません。でも、DrawLineOnWidget 内で drawgc を使ってますが、DrawLineOnWidget を呼び出す前に drawgc に GC をセットし忘れているように見えます。 あと、戻り値を見ると XtWindow(w) で NULL が返ってるのが 問題…なのかなぁ。解決法がわかったら教えて下さい。 |
|
> 非常に興味のある分野なので答えたいのはやまやまなのですが、 素早いご返答ありがとうございます。 > drawgc を使ってますが、DrawLineOnWidget を呼び出す前に > drawgc に GC をセットし忘れているように見えます。 本によると、ウィジェットをリアライズした後にGCを 設定するようなことがかいてありましたもので XtRealizeWidget(toplevel); よりも後にdrawgcをセットすることにしたのです。 もう少し調べてみます。 > あと、戻り値を見ると XtWindow(w) で NULL が返ってるのが すみません、これはどういうことなのでしょうか。 NULLが返ってくるというのはどのように調べたらよろしいのでしょうか。 NULLが返ってるとなるとおそらくここが悪いのだと思います。 う〜ん、もう少し調べてみます。 |
|
> XtRealizeWidget(toplevel); > よりも後にdrawgcをセットすることにしたのです。 うーん、XDrawLine を呼んだ時点で X サーバとの通信が 行われると思うんで、やっぱりセットしておかないと いけないんじゃないかなぁ…。GC は typedef struct _XGC * GC; なので、GC の中身がゴミ (初期化してないので) だと まずいと思うのです。 > NULLが返ってくるというのはどのように調べたらよろしいのでしょうか。 printf("%d\n",XtWindow(w)) としました。他の部分で同じことを すると何か値が入っているのですが、XDrawLine の前で表示させると 0 となってしまうので、XtWindow がこけてるのかと思いました。 まぁ、知識がないのに推測を重ねるのもアレなので、 会社にある本を読んで調べてみます。 |
|
> 他の部分で同じことをすると何か値が入っているのですが、 > XDrawLine の前で表示させると 0 となってしまうので、 > XtWindow がこけてるのかと思いました。 例えばDrawLineOnWidget(label)の書いてあった手前に printf("XtDisplay(label) = %d\n",XtDisplay(label)); printf("XtWindow(label) = %d\n",XtWindow(label)); と書いたところ、XDrawLine の前で表示させるのと同様に 次のようになってしまいました。 XtDisplay(label) = 67584 XtWindow(label) = 0 やはり0というのはまずいのでしょうか。labelを使い回して いくつかの窓を表示させようとしているのがまずいのか・・・。 あとdrawgcのセットをDrawLineOnWidget(w)の中で下記のように 行ってみたところ、 drawgc=XCreateGC(XtDisplay(w),XtWindow(w),0,NULL); XSetForeground(XtDisplay(w),drawgc,pixel[1]); XSetBackground(XtDisplay(w),drawgc,pixel[0]); DrawLineOnWidget(label)は抜け出て、ok6までは到達したのですが X Error of failed request: BadDrawable (invalid Pixmap or Window parameter) Major opcode of failed request: 55 (X_CreateGC) Resource id in failed request: 0x0 Serial number of failed request: 35 Current serial number in output stream: 48 となってしまいました。 お手数お掛け致しまして申し訳ございません。 |
|
> labelを使い回していくつかの窓を表示させようとしているのがまずいのか・・・。 各窓がだぶらないようにlabel1,label2,・・・といったように してみましたが結果的にうまくいきませんでした。 |
|
根本的には何がまずいかと言うと、 1. GC をセットしていない (その結果 core dump) 2. Window がマッピングされる前に XtWindow を実行している (その結果 X Error) だと思います。1は先に述べた通り。2は XtWindow の前に XtRealizeWidget が必要なんでしょう。 で、そういえば一応 Xt の本を持ってたな〜と思い出したので読んでみると、 a. Form ウィジェットの上に Simple ウィジェットを作成 b. Simple ウィジェットに、Exposure イベントへの コールバック関数を設定 c. XtAppMainLoop でイベント待ち d.コールバック関数が呼ばれて、その中で XDrawLine という手順を踏んでました。 実際には何も試してませんが、上の通りにやってみては いかがでしょう。なお、a は必須かどうかわかりません。 Label ウィジェットに直接 XDrawLine できるのかもしれません。 flock の件はまたまた後程。うーん、調べる時間がない…。 |
|
> 実際には何も試してませんが、上の通りにやってみては > いかがでしょう。なお、a は必須かどうかわかりません。 ありがとうございます。いろいろ試してみます。 |
|
> a は必須かどうかわかりません。 必須ではありませんでした。以下のような感じで一応描画はできました。 正しいかどうかはわかりませんが。 void repaint(){ XDrawLine(XtDisplay(label),XtWindow(label),gc,0,0,100,100); } main(){ ... XtAddEventHandler(label,ExposureMask,FALSE,repaint,NULL); XtRealizeWidget(toplevel); ... } 現実的には、Pixmap に書いておいて、Expose が発生するたびに Pixmap から Window にコピーするのが効率的です。 # それ用の Widget が Xt にあったりするんだろうか。 うーん、やっぱり UNIX 使いとしては、基礎知識として、Xt は 抑えておかねばなぁ…。 |
|
はじめまして。初心者にもわかりやすいUNIXのHPでよく利用させて頂いていま す。早速ですが、質問があります。kinput2をバックグラウンドで起動した後、 netscapeを起動しようとすると以下のようなメッセージを残してすぐに落ちて しまいました。どのようにすれば解消できるでしょうか? % kinput2 -canna -jserver remotehost & % netscape & [2] Bus error netscape(core dumped) (↑このメッセージを残してnetscapeが落ちます。) |
|
@68userさん すみません、ちょっと横から質問です。 >> では、DNSクライアントとnamedデーモンが、 >> UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。 >その通りです。 ぼく、ずっとUDPの「53」番(ゾーン転送のときはTCPも)だと思っていたんですが、 これは間違ってたんでしょうか? #うーむ、心配になってきました・・・確認しよっと。 |