掲示板
Powered by OTD
この記事は、K.Maebashi's BBSの過去ログです。
書き込む場合は、新しい掲示板へお願いします。
[日付順表示] | [日付順インデックス] | [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[570] Re:ヘッダファイルの意味(ポインタ完全性覇)
返信


投稿者: (ぱ)
2004/01/04 20:26

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 今気付いたんですが、

> 「ポインタ完全性覇」のことなんですが、

なんだかえっち。


[569] Re:ヘッダファイルの意味(ポインタ完全性覇)
返信


投稿者: (ぱ)
2004/01/04 20:24

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > 僕のヤツは5刷なんですがプロトタイプ宣言はしてないですよね、でもlist4-6とlist4-8
> をリンクするだけでいけますよ。

プロトタイプ宣言は、

(a)引数の数や型が間違っていたときコンパイラに怒ってもらうため
(b)戻り値の型を正しく扱うため

に書くものです。ですから、なくても動くケースはあります。
が、今時のコンパイラなら、プロトタイプ宣言がないときは警告のひとつくらい
出すはずです。ishikawa さんの環境はbccのようですが、当方で試したところ
やはり警告が出ました。

警告 W8065 a.c 5: プロトタイプ宣言のない関数 'sub' の呼び出し(関数 main )

このサンプルでは実行形式はできましたし、動きもしましたけど。

-- main.c ----------
int main(void)
{
sub();
return 0;
}

-- sub.c ----------
#include <stdio.h>

void sub(void)
{
printf("hello, world.\n");
}
-- コンパイル手順 ----------
c:\ctest\bcc>bcc32 sub.c main.c
bcc32 sub.c main.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sub.c:
main.c:
警告 W8065 main.c 3: プロトタイプ宣言のない関数 'sub' の呼び出し(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
-----------------------------

> これは「実行可能ファイルのソースの順番」が main関数が入っていない
> list4-6 を先に置いた(先に実行される)・・だからプロトタイプ宣
> 言はいらない、という考え方でいいんですか?

先に置いた、というのが、上のコンパイル手順にあるように、
「bcc32 sub.c main.c」としてコンパイルを実行した、という意味であれば、
これまた上の例にあるように、bcc32では警告が出たはずです。

もしかしてひとつのソースファイルの中に並べて書いてますか?
それなら確かに、呼び出される側の関数を先に書けば、プロトタイプ宣言は
不要になりますが。


[568] Re:ヘッダファイルの意味(ポインタ完全性覇)
返信


投稿者: ishikawa
2004/01/04 11:48

Mail:   Link:
  > プロトタイプ宣言です。
> ただ、ポインタ完全制覇の5刷より前の版では、read_file.cの中で
> read_line()のプロトタイプ宣言を(重複して)してしまっていましたから、
> read_line.hは実は不要でした。これは当方のポカです。
僕のヤツは5刷なんですがプロトタイプ宣言はしてないですよね、でもlist4-6とlist4-8
をリンクするだけでいけますよ。これは「実行可能ファイルのソースの順番」が main関
数が入っていないlist4-6 を先に置いた(先に実行される)・・だからプロトタイプ宣
言はいらない、という考え方でいいんですか?
(その辺がよく分からないです・・・)

> いや、この場合(aaray_p = &arrayの場合)は「配列へのポインタ」ですから、
> 12バイト進むのが正しいのです。次のページに、まさに「ポインタに1を
> 加算することにより12バイト進みます」と書いてあります。
ありがとうございます。


[567] Re:ヘッダファイルの意味(ポインタ完全性覇)
返信


投稿者: (ぱ)
2004/01/04 10:34

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > ってますよね、そしてlist4-8 read_fileでそのヘッダを使っていますよね、・・・で
> このヘッダはどういう意味があるのでしょうか?

プロトタイプ宣言です。
ただ、ポインタ完全制覇の5刷より前の版では、read_file.cの中で
read_line()のプロトタイプ宣言を(重複して)してしまっていましたから、
read_line.hは実は不要でした。これは当方のポカです。

どこかの.cファイルで関数群を定義したとき、それを「使う人」のために、
プロトタイプ宣言や型宣言を含むヘッダファイルを提供することは、
普通に行われることです。この例では、その「作法」に従っているつもりです。
# でも本のサンプルプログラムの場合、どこまでそういった「作法」に
# 従うべきかは微妙なところで、いじりまわしているうちに余計なプロトタイプ
# 宣言が残ってしまいました… ←言い訳

> それとP153で、aaray_p = &array; はいけるが array_p = array; は
> ダメと書いてありますが、僕の環境(BCC)では両方ともダメでした
> (警告はでませんでしたが、アドレス演算のときに12バイト進みました)

いや、この場合(aaray_p = &arrayの場合)は「配列へのポインタ」ですから、
12バイト進むのが正しいのです。次のページに、まさに「ポインタに1を
加算することにより12バイト進みます」と書いてあります。


[566] ヘッダファイルの意味(ポインタ完全性覇)
返信


投稿者: ishikawa
2004/01/04 00:25

Mail:   Link:
 どうも、この前お世話になったishkawaです。

「ポインタ完全性覇」のことなんですが、p220でread_line.hというヘッダファイルを作
ってますよね、そしてlist4-8 read_fileでそのヘッダを使っていますよね、・・・で
このヘッダはどういう意味があるのでしょうか?別にそのヘッダをインクルードしなく
てもread_line.cをリンクするだけでいけますよね。始めはプロトタイプ宣言かな・・
とか思ったんですが別になくてもいけるし・・・。
(あと関係ないんですが、このプログラムを動かすのちょっと苦労しました。「Ctrl+z」
のやり方を忘れていた・・・)

それとP153で、aaray_p = &array; はいけるが array_p = array; はダメと書いてありま
すが、僕の環境(BCC)では両方ともダメでした(警告はでませんでしたが、アドレス演算
のときに12バイト進みました)

これは、普通の環境だったら違うんでしょうか?(VCとかだったら・・・)


[565] Re:Windowsの環境まわり
返信


投稿者: (ぱ)
2004/01/02 22:52

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 遅ればせながらあけましておめでとうございます。
本年もよろしくお願いいたします。

> > Windowsでは、ちょっと調べようとすると、そこらの書店にはなかなか
> > 売ってない、高くて分厚い本に頼らなければならないように思います。
> 私は最近Windowsについてはあまり調べものをしないのですが、
> 最近困ったことってどんなことでしょう?(もし差し支えなければ)

最近でもないですが、COMの使い方についてかつて調べたとき
結構苦労しました。MFCあたりも結局MSDNを引くことになっちゃって、
「導入用の教科書」ってあんまりなかった気がします。

> 高くて分厚い本と言えば私はOracleを連想します。

Oracleはマニュアル自体高くて分厚かったような。


[564] Windowsの環境まわり
返信


投稿者: れぷ
2003/12/31 21:17

Mail:   Link:
 ということで立てました。

> http://onisci.com/450.html
> このネタですね。広告料がもらえるとは思えませんが、
う。既にそういうネタがあったのですね(^^;;;;;;

> 古いソースだと、どうかなあという気がしないでもないですが…
確かにパラッと見たらポインタ演算とかキャストしまくりでした。
でも電車で読むのに買ったので年明けにゆっくり読むとします。:-)

> Windowsでは、ちょっと調べようとすると、そこらの書店にはなかなか
> 売ってない、高くて分厚い本に頼らなければならないように思います。
私は最近Windowsについてはあまり調べものをしないのですが、
最近困ったことってどんなことでしょう?(もし差し支えなければ)

高くて分厚い本と言えば私はOracleを連想します。
今年何冊買ったんだろう・・・。;-<


[563] Re:ポインタ完全制覇
返信


投稿者: (ぱ)
2003/12/31 17:54

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > 購入して読んでいます。
> 今まで買ったC関係の本の中で一番勉強になるし、おもしろいです。

ありがとうございます。

最近購入されたのであれば、新しい版だと思うので、ほとんど修正されているはず
ですが、一応正誤表をご確認くださいませ。ポカが多く申し訳ありません。


[562] Re:◆タバコ◆ MILD SEVEN 1箱が184円。
返信


投稿者: (ぱ)
2003/12/31 17:53

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 うーん、このツリーは、「スレッド順インデックス」で表示されないようだから、
話を続けるなら別スレ立てたほうがよいかも。

> 私も以前から掲示広告料を取ってもいいんじゃないかと思っている次第です。

この掲示板のヘルプからもリンクしてますが、
http://onisci.com/450.html
このネタですね。広告料がもらえるとは思えませんが、抑止力くらいには
なるかも。

> あと興味深い本として「プログラミングテクニック」(ASCII刊)というものを
> 衝動買いしてみました。主にアルゴリズムの説明みたいですが、
> UNIXコマンドのソースを解析して引用している点がちょっと興味をそそりました。

古いソースだと、どうかなあという気がしないでもないですが…

> # 最近になってやっとUNIXプログラムの本が増えてきましたね。

うーん、私はWindowsのプログラミングの本(入門書)こそが
足りてない気がするんですけど。
Windowsでは、ちょっと調べようとすると、そこらの書店にはなかなか
売ってない、高くて分厚い本に頼らなければならないように思います。


[561] ポインタ完全制覇
返信


投稿者: ながの
2003/12/31 02:19

Mail:   Link:
 購入して読んでいます。
今まで買ったC関係の本の中で一番勉強になるし、おもしろいです。
感謝。


[560] Re:◆タバコ◆ MILD SEVEN 1箱が184円。
返信


投稿者: れぷ
2003/12/30 23:20

Mail:   Link:
 > 人に見られればそれだけで多少なりとも価値があると思うんで、
私も以前から掲示広告料を取ってもいいんじゃないかと思っている次第です。
やはり雑誌広告のように細分化して
サイトのどの場所を貸すのかと掲示する期間の見合いで金額を徴収しないと。:-p

そうそう。全然話は変わりますが件のジュンク堂に行ってみました。
JISを閉じたキングファイルが並んでかなり壮観な書店ですね。

C89のものが欲しいと思ったのですが、今年になってC99になったようです。
16,500円なのですが他にも欲しい本があったので仕方なく帰ってきました。

あと興味深い本として「プログラミングテクニック」(ASCII刊)というものを
衝動買いしてみました。主にアルゴリズムの説明みたいですが、
UNIXコマンドのソースを解析して引用している点がちょっと興味をそそりました。
# 最近になってやっとUNIXプログラムの本が増えてきましたね。


[559] Re:◆タバコ◆ MILD SEVEN 1箱が184円。
返信


投稿者: (ぱ)
2003/12/30 19:58

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 げ、うちにも広告が来るか…

晒しものにしとくという手もあるわけだけど、広告ってのはやっぱり
人に見られればそれだけで多少なりとも価値があると思うんで、
削除しときます。

# 確かレスつけた投稿も非表示にできたはず。



[557] Re:Linuxでプロセス情報取得したい
返信


投稿者: (ぱ)
2003/12/29 15:16

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > procfs 自体はベル研の発明で、たしか POSIX.1 以前から存在した
> と思います。

ありゃりゃ。それは認識不足でした。

> しかし、ps 用の情報というのはかなり OS への依存度
> が高いので、結局統一されませんでした。procfs 経由で ps 用の
> 情報を得られる OS にしても、OS ごとにその形式はバラバラです。

procfsを実装する人にしたって、既存のOSと「わざわざ」変えようとは
思わないでしょうから、それでも形式がバラバラになるということは、
やっぱりOSへの依存度が高いということなんですかねえ。
にしても共通の部分集合はありそうに思うんですが。

> POSIX は基本的にアプリケーションのための規格ですから、たぶん
> ps みたいにシステム寄りの機能は、対象外だと考えたんじゃないか
> と思います。

うーん確かに私自身psをプログラム中から呼びたいと思ったことは
ないですね…


[556] Re:Linuxでプロセス情報取得したい
返信


投稿者: kit
2003/12/28 21:20

Mail:   Link:
 procfs 自体はベル研の発明で、たしか POSIX.1 以前から存在した
と思います。しかし、ps 用の情報というのはかなり OS への依存度
が高いので、結局統一されませんでした。procfs 経由で ps 用の
情報を得られる OS にしても、OS ごとにその形式はバラバラです。

POSIX は基本的にアプリケーションのための規格ですから、たぶん
ps みたいにシステム寄りの機能は、対象外だと考えたんじゃないか
と思います。同じように POSIX の対象外となっている機能には、
たとえば mountシステムコールなんかがあります。これについては、
昔からどんなUNIX系OSにもシステムコールとして存在していたわけ
ですが…

いまではどんなUNIX系OSでも、kernel memory を覗くという野蛮な
方法を使わずにpsが実現されているわけですが、いくつかのUNIX
の ps は、それと引き替えに、kernel crash dump に対して ps を
実行して、crash 時のプロセス状態を表示させるという機能を失っ
てしまいました。この機能については、昔の ps の方が安直に実装
できていたかもしれません。
なお、BSD系のpsは、今でもこの機能を保っています。


[555] Re:メッセージ送出=単なる関数呼び出しの結論について
返信


投稿者: (ぱ)
2003/12/28 14:33

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > これもよく分かりません。
> ただの関数呼び出しだと思います。
> オブジェクトを使う側からすれば、そのオブジェクトのメソッドを
> 実行したいだけなので、内部的には別のメソッドが実行されるとしても
> そんなことは気にする必要はないんじゃないかと。

私もそう思います。

ただ、「内部的には別のメソッドが実行される可能性がある」から、
それは「単なる」関数呼び出しとはちょっと違うでしょ、という主張なら、
わからなくもないです。

でも、実際にナベさんが、「関数呼び出し」のイメージから、特に無理なく
ポリモルフィズムを理解しておられることからわかるように、
ポリモルフィズムを理解するにしても、「関数呼び出し」の方から階段を
登っていく方が、いきなり「これはメッセージだ! 関数呼び出しとは違う!!」
などと言われて「????」となってしまうよりずっと得策だと思います。

> 分かりやすい内容でしたので、続きを楽しみにしています。

ありがとうございます。
ただ、ここへ来ていろんなものが攻めてきて、続きがなかなか… (_o_)

> なんというのか、
> どこまで理解できたらオブジェクト指向が分かったと言えるのか
> という指標が分からないので不安があるのです。

たとえばJavaなら、大量のクラスライブラリが付属していますから、
Swingあたりの設計方針が理解できれば「分かった」と考えてよいのでは
ないでしょうか。


[554] Re:Linuxでプロセス情報取得したい
返信


投稿者: (ぱ)
2003/12/28 14:15

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > もっと言うと、/proc/ の内容も、task_struct ほど頻繁ではないにせよ、
> 将来は変化する可能性があるわけです。
> 移植性を最重視するなら、/bin/ps コマンドを実行して、その出力を
> 解釈した方が良いかもしれません。

ところで、私の認識だと、
・UNIXはカーネルとのインタフェースは基本的に全てシステムコールを
 経由して行うようになっている。
・でもpsは、こんなことやるプログラムは滅多にないだろうということで
 Ken TompsonだかDennis Ritchieだかが手を抜いてシステムコールを
 作らなかった。
・そしてそれは失敗だったと一般に認識されている。
ということだと思っています(Life with UNIXの受け売りですが)。

しかし、それからもうずいぶん経っているわけで、POSIXなりあたりで
psに相当するシステムコールが定められていてもよさそうに思うんですが、
そうはならなかったわけですよね。今規格書をぱらぱらめくってみましたが
見つけられませんでしたし。
procfsにしても、出てきたのってPOSIXより後ですよね。

どうしてこういうことになっちゃったんでしょうか。


[553] Re:Linuxでプロセス情報取得したい
返信


投稿者: (ぱ)
2003/12/28 13:50

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > そもそも、uptime や start を、char 型の変数に保持
> してるってことがなんか変ですね。Linux 上で char 型
> を使った場合、-128〜127の値しか保持できませんから
> uptime や start を保持するには不十分です。

言われてみれば f(^^;

> /proc/$PID/status の該当行を一度 char 型の配列に
> 取得したあと、sscanf() 等を使って long 型の数値に
> 変換する必要があるのでは?

だとするとcharではなくchar*だったのかなあ、とも思いますが、
char*同士の引き算だと、gccでは

invalid operands to binary -

というエラーメッセージにはならないようですし。うーん。


[552] Re:Linuxでプロセス情報取得したい
返信


投稿者: kit
2003/12/28 02:35

Mail:   Link:
 そもそも、uptime や start を、char 型の変数に保持
してるってことがなんか変ですね。Linux 上で char 型
を使った場合、-128〜127の値しか保持できませんから
uptime や start を保持するには不十分です。

/proc/$PID/status の該当行を一度 char 型の配列に
取得したあと、sscanf() 等を使って long 型の数値に
変換する必要があるのでは?


[551] Re:メッセージ送出=単なる関数呼び出しの結論について
返信


投稿者: ナベ
2003/12/27 23:54

Mail:   Link:
 > というか、ナベさんはどう思われますか?

私は、メソッドを呼ぶということはC言語の関数呼び出しと同じイメージだと考えていました。
オブジェクトに対して、仕事を依頼することがメッセージ、
メッセージ=メソッドだと認識していました。
ただ、みなさんの書き込みを見てそれは違うのかなと思ったので質問させて頂きました。

> もちろんC++やJavaでもメソッドオーバロードの機能はあって、
> この機能を使うと、対象とするオブジェクトのクラスによって
> 実際に実行されるメソッドを実行時に選択することができます。
> これをもって「単なる」関数呼び出しではない、と主張することは
> 可能でしょう。

これもよく分かりません。
ただの関数呼び出しだと思います。
オブジェクトを使う側からすれば、そのオブジェクトのメソッドを実行したいだけなので、
内部的には別のメソッドが実行されるとしてもそんなことは気にする必要はないんじゃないかと。

例えば、
obj.hoge();
このとき、
hoge()がobjの親クラスのhoge()を実行するとしても
objのhoge()を実行したのだという認識でいいんだと思います。

> でも私は「疑り深い〜」にも書いているように、継承やポリモルフィズムは
> 必ずしも最初に覚えなければならないことではないと考えます。
> だから最初の理解は「関数呼び出し」でまったく問題なく、
> ポリモルフィズムは別途後で憶えればいいでしょ、と言っているわけです。
> それより先にまず「インスタンス」がわからなければ話にならない、と。

「疑り深い〜」は読ませて頂きました。
分かりやすい内容でしたので、続きを楽しみにしています。
インスタンスについても理解できたと思います。

> >こんなものに「メッセージ」などという大仰な名前を付けていることが、
> > 結果としてオブジェクト指向の理解を妨げていると思います。
>
> という意見は全く変わっていません。

最初のうちは、メッセージなど気にしなくてもよいってことですよね。
なんというのか、
どこまで理解できたらオブジェクト指向が分かったと言えるのか
という指標が分からないので不安があるのです。

これからもつまらない質問をしてしまうかもしれませんが、
よろしくお願いします。


[549] Re:メッセージ送出=単なる関数呼び出しの結論について
返信


投稿者: (ぱ)
2003/12/27 20:43

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > Java、C++限定ということなら「メッセージ送出=単なる関数呼び出し」
> と考えてよいのでしょうか。

というか、ナベさんはどう思われますか?

少なくとも呼び出すメソッドが決まっているケースでは、
(SmalltalkだろうがObjective-Cであろうが)「メッセージ送出」なんて
言っても結局オブジェクトへの参照を隠れた引数にした関数呼び出しと
変わらない挙動しかしていないでしょう。
それは、ナベさんも、ちょっとコードを書いてみれば実際に試すことが
できる話です。

もちろんC++やJavaでもメソッドオーバロードの機能はあって、
この機能を使うと、対象とするオブジェクトのクラスによって
実際に実行されるメソッドを実行時に選択することができます。
これをもって「単なる」関数呼び出しではない、と主張することは
可能でしょう。

でも私は「疑り深い〜」にも書いているように、継承やポリモルフィズムは
必ずしも最初に覚えなければならないことではないと考えます。
だから最初の理解は「関数呼び出し」でまったく問題なく、
ポリモルフィズムは別途後で憶えればいいでしょ、と言っているわけです。
それより先にまず「インスタンス」がわからなければ話にならない、と。

>こんなものに「メッセージ」などという大仰な名前を付けていることが、
> 結果としてオブジェクト指向の理解を妨げていると思います。

という意見は全く変わっていません。


[548] Re:Linuxでプロセス情報取得したい
返信


投稿者: (ぱ)
2003/12/27 20:20

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 今回の件では私はまるっきり役立たずでしたが (^^;

> start_time = time(NULL) - uptime + start / HZ;
> 上記で実行するとエラーは下記のようになりました。
> > invalid operands to binary -
> invalid operands to binary /

そんなはずは… 念のためうちでも試してみましたが、再現しませんでした。
こちらで試したソースは以下の通り。Vine Linux上のgcc 2.95.3です。

#include
#include

int
main(void)
{
time_t start_time;
char uptime;
char start;

start_time = time(NULL) - uptime + start / HZ;

return 0;
}

エラーメッセージからすると、ともさんの環境もgccっぽいですが、
文法的にも、time_t(longとかunsigned longとか)とcharの引き算で
エラーが出るとは思えないです。

もう少し詳細な情報を教えてもらえませんか?



[547] メッセージ送出=単なる関数呼び出しの結論について
返信


投稿者: ナベ
2003/12/26 19:16

Mail:   Link:
 はじめまして、ナベといいます。
「メッセージ送出=単なる関数呼び出し」について
みなさんの意見を読んでみましたがよく分かりませんでした。

私は、当面JavaかC++をやっていこうと思っているのですが、
Java、C++限定ということなら「メッセージ送出=単なる関数呼び出し」
と考えてよいのでしょうか。


[546] Re:Linuxでプロセス情報取得したい
返信


投稿者: とも
2003/12/26 15:56

Mail:   Link:
 > > 1. /proc/$PID/stat の 22 番目の欄が、起動後 HZ を単位として
> > 計った開始時刻。この値を start_time とする
> > 2. そのマシンの uptime は /proc/uptime 中の 1 番目の欄から求まる。
> > 単位は 秒。この値を uptime とする
> > 3. HZ の値は #include <asm/param.h> で得られる。
> > 4. 上記の結果から
> > (time(NULL) - uptime) + start_time / HZ
> > で、開始時刻が time_t 型の値として得られるので、
> > これを ctime() 等の関数で文字列に直せば良い。

上記を作成しし,4の計算式を算出しようとしたのですが,がうまくできません。
いろいろキャストしてみると,エラーはでなくなるのですが,値がおかし
くなってしまいました。。

各 変数の型は下記の通りです。
time_t time(NULL)
char uptime
char start
time_t start_time

start_time = time(NULL) - uptime + start / HZ;
上記で実行するとエラーは下記のようになりました。

invalid operands to binary -
invalid operands to binary /

どうすればうまく計算してくれるのでしょうか?

C言語の初歩的な質問で申し訳ございませんが,よろしくお願い致します。


[545] Re:Linuxでプロセス情報取得したい
返信


投稿者: kit
2003/12/19 16:01

Mail:   Link:
 > そのためには英語がある程度できないとだめですね。

そうですね。ただ技術英語の場合、文法の知識は中学生レベルで
いいので、大量に英語を読んで、用語に慣れるというのが大事だ
と思います。実際、僕も大学を出るまでは英語は苦手だったんですが、
毎日オンラインの英和辞典を引きながら英語を読んでるうちに、
いつの間にか慣れました。

> ダウンロードしたのは,「procps-3.1.11.tar.gz」です。
> grepで「init_Hertz_value」を探したのですが,見つかりませんでした。
> 探した場所は「proc/sysinfo.c」です。
> 見ているソースが違うのでしょうか?

う、すいません。最新のソースだと proc/sysinfo.c の init_libproc()
を見るのが良いようです。HZ で grep すると、すぐ見つかります。
3.1.11 を見ると、sysconf(_SC_CLK_TCK) を使うのも、もはや古い方法で
良くないみたいですね。
find_elf_note() で Hertz を得るのが正しいようです。


[544] Re:Linuxでプロセス情報取得したい
返信


投稿者: とも
2003/12/19 11:22

Mail:   Link:
 > せっかくソースがフリーで手に入るわけですから、なにか疑問が
> 生じたら、まずソースを読む、そのために、ふだんからソースを
> 展開しておいてすぐに調べられるようにしておく、また、Web
> ページ等の二次的な情報よりも、まず最初に(英語の)正式な
> ドキュメントを読んで調べるといったことを心がけるのが
> 良いのではないでしょうか。
>

そのためには英語がある程度できないとだめですね。

ご指摘のとおり,下記URLからprocpsを入手しました。
http://procps.sourceforge.net/

ダウンロードしたのは,「procps-3.1.11.tar.gz」です。
grepで「init_Hertz_value」を探したのですが,見つかりませんでした。
探した場所は「proc/sysinfo.c」です。
見ているソースが違うのでしょうか?

> 個人的には、こういう目的には、BSD系のOSの方が便利だと思って
> ます。OS全体のソースが、全て展開された形で簡単に得られるので。
> また、ある機能について、複数の異なるOSの実装を調べて比べて
> みるというのも、いろいろ勉強になると思います。

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


[543] Re:Linuxでプロセス情報取得したい
返信


投稿者: kit
2003/12/19 00:27

Mail:   Link:
 > ところで,そのような知識を得るためにお勧めの雑誌や書籍などあり
> ましたら教えていただけないでしょうか?

> まだまだUnix初めて1年半,Linuxに関してはほとんど知識ゼロの
> 初心者ですので,もっといろいろな技術を習得したいと思っています。

うーん、Stevens, Vahalia, Kernighan & Pike, Bach, Rochkind
みたいなUNIX 関係の定番書籍は(和訳で)読んでますが、Linux
関係の本や雑誌はほとんど読んでないので、良く分かりません。

今度の件も、昔のUNIXはどうしていたかとか、SVR4はどうしている
かとか、BSD系のOSではどうかというのは知ってましたが、Linuxに
ついては、質問を見てから procps のソースを grep してみたと
いうぐらいなので、以前から知識があったわけではないです。

せっかくソースがフリーで手に入るわけですから、なにか疑問が
生じたら、まずソースを読む、そのために、ふだんからソースを
展開しておいてすぐに調べられるようにしておく、また、Web
ページ等の二次的な情報よりも、まず最初に(英語の)正式な
ドキュメントを読んで調べるといったことを心がけるのが
良いのではないでしょうか。

個人的には、こういう目的には、BSD系のOSの方が便利だと思って
ます。OS全体のソースが、全て展開された形で簡単に得られるので。
また、ある機能について、複数の異なるOSの実装を調べて比べて
みるというのも、いろいろ勉強になると思います。


[542] Re:Linuxでプロセス情報取得したい
返信


投稿者: とも
2003/12/18 10:10

Mail:   Link:
 > > 取得したいuid,gidは各プロセスごとの実行ユーザのuid,gidです。
>
> uid/gid は、/proc/$PID/status の「Uid:」「Gid:」の
> 行からとれます。各行は前から順に real u/gid,
> effective u/gid, saved u/gid, filesystem u/gid ですから、
> 最初の欄の real uid, real gid を使えば良いでしょう。
>

/proc/$PID/statからはuid,gidは取得できないのですね。
/proc/$PID/statusから取得するようにします。

> > プロセスごとの実行時間はどのようにしたら取得できるのでしょうか?
>
> 実行時間は、/proc/$UID/stat の 14欄目と15欄目に、
> user time と system time に別れて、HZ を単位として
> 入っています。従って、この両者の値を加算してから
> HZ で割れば秒数になります。
>
> あと、HZ の値は <asm/param.h> から得るよりも、
> sysconf(_SC_CLK_TCK) を使った方が良いみたいです。
> 詳しくは新しめの procps のソースの
> proc/sysinfo.c:init_Hertz_value() を参照。
> (前の記事は古い procps を見て書いてました)
>

さっそく試してみます。

> こういう情報を得ることは /bin/ps がやっていることなので、
> /bin/ps のソースを見れば、どうすれば良いか全て分か
> ります。ソースは下記のサイトから入手できます。
> http://procps.sourceforge.net/
>
> > 2.Linuxではプロセス情報の管理をtask_struct構造体で管理していると
> > とあるサイトで紹介されていましたが,この構造体は使用しなくても
> > プロセスごとの情報を取得できるということでしょうか?
>
> task_struct 構造体は、プロセス情報を取得するインターフェースでは
> なく、プロセス情報を管理する実装として用いられています。ここから
> 情報を得ようとすると、Linux のカーネルのバージョンが変わるたびに
> プログラムの変更を余儀なくされてしまいますから、どうしても必要が
> ない限り、利用しない方が賢明でしょう。
>
> もっと言うと、/proc/ の内容も、task_struct ほど頻繁ではないにせよ、
> 将来は変化する可能性があるわけです。
> 移植性を最重視するなら、/bin/ps コマンドを実行して、その出力を
> 解釈した方が良いかもしれません。

了解しました。
task_struct構造体は使用しないで作成します。

様々なご意見ありがとうございました。
早速作成してみます。

ところで,そのような知識を得るためにお勧めの雑誌や書籍などありましたら
教えていただけないでしょうか?

まだまだUnix初めて1年半,Linuxに関してはほとんど知識ゼロの初心者ですので,
もっといろいろな技術を習得したいと思っています。

よろしくお願い致します。


[541] Re:Linuxでプロセス情報取得したい
返信


投稿者: kit
2003/12/17 23:00

Mail:   Link:
 > 取得したいuid,gidは各プロセスごとの実行ユーザのuid,gidです。

uid/gid は、/proc/$PID/status の「Uid:」「Gid:」の
行からとれます。各行は前から順に real u/gid,
effective u/gid, saved u/gid, filesystem u/gid ですから、
最初の欄の real uid, real gid を使えば良いでしょう。

> プロセスごとの実行時間はどのようにしたら取得できるのでしょうか?

実行時間は、/proc/$UID/stat の 14欄目と15欄目に、
user time と system time に別れて、HZ を単位として
入っています。従って、この両者の値を加算してから
HZ で割れば秒数になります。

あと、HZ の値は <asm/param.h> から得るよりも、
sysconf(_SC_CLK_TCK) を使った方が良いみたいです。
詳しくは新しめの procps のソースの
proc/sysinfo.c:init_Hertz_value() を参照。
(前の記事は古い procps を見て書いてました)

こういう情報を得ることは /bin/ps がやっていることなので、
/bin/ps のソースを見れば、どうすれば良いか全て分か
ります。ソースは下記のサイトから入手できます。
http://procps.sourceforge.net/

> 2.Linuxではプロセス情報の管理をtask_struct構造体で管理していると
> とあるサイトで紹介されていましたが,この構造体は使用しなくても
> プロセスごとの情報を取得できるということでしょうか?

task_struct 構造体は、プロセス情報を取得するインターフェースでは
なく、プロセス情報を管理する実装として用いられています。ここから
情報を得ようとすると、Linux のカーネルのバージョンが変わるたびに
プログラムの変更を余儀なくされてしまいますから、どうしても必要が
ない限り、利用しない方が賢明でしょう。

もっと言うと、/proc/ の内容も、task_struct ほど頻繁ではないにせよ、
将来は変化する可能性があるわけです。
移植性を最重視するなら、/bin/ps コマンドを実行して、その出力を
解釈した方が良いかもしれません。


ひとつ前の過去ログ | 目次へ | ひとつ後の過去ログ