人に聞けない痔の悩み、これでスッキリ >>

HP-UXのシステム起動時からの時間(uptime)をC言語で取る方法を教えてください。
497日問題のような上限値があるのか?あればどのタイミングで上限に達するのか?
達したらどうなるのか?(0に戻る?)も出来れば教えていただきたいです。

カーネルのバージョンによる違いがあればお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

なるほど…。

であれば、CPUの使用時間(ユーザー・カーネル)など、全てを
足しあわせて算出するほかないようですね。
自分の中にある時間情報も使えず、おそらく外部のネットワークに時間を
問い合わせるのも、禁止なんでしょうね。
それで分以下の精度となると、ちょっと今の私には解決案が思いつかないです。
申し訳ない。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。
HP-UXのuptimeコマンドのソースが見れたらいいんですけどねぇ。
CPU使用時間の合計とuptimeコマンドの値がなぜ微妙にズレるのか…。
そこがミソですね。

もう少し待って回答がなければ質問を締め切りたいと思います。

お礼日時:2010/07/01 23:21

紹介したページにある、


00817 get_uptime(void)
の実装でも同様ですか?

この回答への補足

なるほど。趣旨を説明していませんでした。すみません。
今回の目的は、システム時刻の変更に影響を受けない時間を取りたかったので、gettimeofday()のような時刻変更に影響を受けるものを使ってuptimeを取得する方法はNGなんです。すみません。

補足日時:2010/06/30 20:22
    • good
    • 0

http://net-snmp.sourceforge.net/dev/agent/system …

00781 #if defined(hpux10) || defined(hpux11)
00782 pstat_getstatic(&pst_buf, sizeof(struct pst_static), 1, 0);
00783 boottime_csecs = pst_buf.boot_time * 100;
あたりが参考になるかも。

あるいは、system("uptime > /foo/temp.txt");
などとして、uptimeの実行結果をテキストに出力させ、
ファイルの中身を確認するなど。

この回答への補足

回答ありがとうございます。
上のは起動した時間(boot_time)ですね。
pstat_getprocessor()のcpu稼動時間を合計するとuptimeに近い値は取れるんですが、数分ズレてるし、時間が経つとuptimeコマンドとの値の差が大きくなっていきます。

uptimeコマンドは分精度なんで使えないです。

補足日時:2010/06/29 21:00
    • good
    • 0

497日問題(?)など、詳しい仕様は知りません。


/proc/uptimeに以下のような情報がありませんか。
http://www.redhat.com/docs/manuals/enterprise/RH …
====
350735.47 234388.90

最初の数字は、システムが起動されている時間の総数を秒単位で表しています。 2番目の数字はその時間のうちのアイドル時間を秒単位で表しています。
====
秒を取得できれば表示したい情報は、計算で求まるのではないかと思います。

この回答への補足

FedoraやCentOSなどのLinuxではそうですね。
HP-UXは/proc/uptimeがないので困ってます(^^;

補足日時:2010/06/28 20:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Q初級者の質問――time_tについて

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と説明しています。
「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。

time_tというのは整数と考えてよいのでしょうか。
time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。

それとも、
time_tが秒数を表すかどうかは処理系に依存するのでしょうか。

もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する)
それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
(あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。)



ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++)


==============プログラム==============

#include <stdio.h>
#include <time.h>

int main(void)
{
time_t a;
a=time(NULL);
printf("%d\n",a);

return(0);
}

================結果===============

1005300371

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と...続きを読む

Aベストアンサー

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0時0分0秒からの経過秒数」というのは慣例に過ぎません。

とはいえ、UNIXを起源とする『time_tはlong』と『time()は1970年1月1日0時0分0秒からの経過秒数』という約束事は変えられる事は無いでしょう。
C98/C89との互換性を保ちながら新規格を作ることが予想されるからです(そうでなければlong longなどという型は作らないはず)。
その意味でyoushirさんのおっしゃるとおりだと思います。

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qコマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法

はじめまして。

Linux(ディストリビューションは問わず)で
コマンド(例えばlsコマンド)を実行して
その出力結果を文字列で取得するプログラムを作成したいです。

コマンドの実行はsystem()で可能なのかな?と思っていますが、
コンソールに出力される内容はどのように取得して良いのか分かりません。

詳しい方がおりましたらご教授お願い致します。

Aベストアンサー

popen/pclose を使います。
---
char buff[1024];
FILE *fp = popen("ls", "r");
while (fgets(buff, sizeof(buff), fp)) {
printf("fgets: %s", str);
}
pclose(fp);
---
こんな感じ。

popen は、入力と出力のどちらか一方しか制御できませんので、入出力の両方を処理したい場合は、
・まじめにやる場合: 入力用・出力用、2本 pipe をつくり、それを標準入出力に dup してからfork&exec
・手をぬく場合: どちらかはANo.1のようなリダイレクトで処理。
という処理をすることになります。

Qtopコマンドで表示されるVIRT、RESおよびSWAPの意味について

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。

topコマンドの出力結果は下の通りです。
この検証用サーバでは暫定的にパーティション設定でスワップ領域を作成していません。
しかしtopコマンドではVIRTとRESの数値は差異があり、SWAP項目も大きな値を示しているプロセスがあります。

スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、SWAPはゼロとなると予想していたのですがどうしてならないのですか?

top - 03:35:44 up 36 min, 3 users, load average: 0.13, 0.17, 0.20
Tasks: 90 total,  1 running, 89 sleeping,  0 stopped,  0 zombie
Cpu(s): 0.0%us, 1.3%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st
Mem:  515340k total,  452152k used,  63188k free,  18132k buffers
Swap:    0k total,    0k used,    0k free,  347404k cached

 PID USER    PR NI VIRT RES SHR S %CPU %MEM  TIME+ SWAP COMMAND
 4602 tomcat  25  0 645m 28m 6996 S 0.0 5.8  0:04.12 616m java
 2227 root   34  19 25656 10m 2108 S 0.0 2.0  0:00.12 14m yum-updatesd
 1680 root   17  0 11580 9964 240 S 0.0 1.9  0:00.02 1616 restorecond
 1936 haldaemo 18  0 5472 3676 1688 S 0.0 0.7  0:01.20 1796 hald
 2499 root   18  0 10540 2916 1504 S 0.0 0.6  0:00.03 7624 httpd
 3672 root   15  0 10064 2888 2308 S 0.7 0.6  0:02.50 7176 sshd
 3927 root   20  0 9916 2880 2308 S 0.0 0.6  0:00.34 7036 sshd
 2054 root   18  0 10116 2328 1696 S 0.0 0.5  0:00.04 7788 cupsd
 2500 apache  25  0 10540 2088 640 S 0.0 0.4  0:00.00 8452 httpd

どうしてもズレるので画像を添付してます。

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。
...続きを読む

Aベストアンサー

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます。

・プロセスが確保したメモリのうち、まだ一回もアクセスして
 いない部分。
  ⇒アクセスしたときに初めて物理メモリが割り当てられ、
   RESにも計上されていきます。
  (javaのRESに比べてかなり大きいVIRTは、これによるものと
   思われます。大きなヒープサイズを指定していませんか?)

・プロセスが ファイルを仮想メモリ空間にmmap(2) したが、
 まだ一回もアクセスしていない部分。
  ⇒Linux(UNIX) には、あたかもメモリをアクセスするかのように
   ファイルを読み書きできる mmap(2) という機能があり、
   かなり多用されています。mmap直後のファイルは、
   VIRTには計上されますが、物理メモリには読み込まれずRESには計上
   されません。ファイルをmmapした仮想メモリ空間にアクセスした
   部分が、物理メモリに読み込まれRESに計上されます。

> スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、
> SWAPはゼロとなると予想していたのですがどうしてならないのですか?

実は、SWAPとして表示される数値は、単に VIRT と RES の差です。

VERT(仮想メモリ総量)の中には、物理メモリ(RES)やスワップ領域の
使用量だけなく上記で挙げたような仮想空間の部分の合計が含まれ
ますから、スワップ領域がゼロでも、上記で挙げたような空間が
SWAP として表れているのです。

個人的にはこの数値をSWAPと呼ぶのは、かなり不適切だと思いますが、
多くのLinuxディストリビューションのtopコマンドで表示される
SWAP欄は、そういう計算をしているということです。

参考URL:http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます...続きを読む

Qx86とARMの性能の違い

x86とARMの性能の違いについて教えていただきたいです。
それぞれの設計に基いたご説明をいただけるとなおありがたいです。
また、性能の違いの結果として、
それぞれどのような場面でよく使われるのかも知りたいです。

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

Aベストアンサー

まず違いを知るなら以下を読むべきかと、有志が書いているとはいえ、日本サイトのただの年表とは段違いに情報があるはずです。
http://en.wikipedia.org/wiki/ARM_architecture
http://en.wikipedia.org/wiki/X86

といって、読める人なら、質問しないのでしょうけど。
概略的に説明すると、ARMは reduced instruction set computing(RISC)プロセッサです。 それに対して、x86はベーシックに言えば、complex instruction set computer(CISC)プロセッサとなります。まあ、世間では既に差はあまりないのですけど、思想としてはCISCとRISCでは演算の基点が違います。

x86と呼ばれるプロセッサは、i8086を始まりとして(86を冠した世代が4世代目まで続いたことから)現在のCore i7プロセッサに至るまでの製品を指します。ただし、64bitモードであるx64(AMD64/Intel64)は、このx86を開発したIntelではなく、AMDが先に実装しています。このx86/64系のプロセッサは、高度で複雑な演算を行うために開発されたプロセッサであり、現在においてHPC用のプロセッサを除けば、世界最速を誇るプロセッサとなります。尚、x86/64系は処理速度を高めるために、スカラユニットの採用と分岐予測、パイプラインによる高速動作などを実現しているため、消費電力が大きなパーソナルコンピュータ、ワークステーション、サーバー分野においてこれまでは使われてきました。価格的にも高性能故にそこそこの値段であり、インテルとAMD以外のメーカーでは、VIAなど一部が進出するのみで、Intelの市場での強さもあり、他のメーカーが力をもつことはありませんでした。


ARMは、元々組み込み向けとしての素質を持つプロセッサで、コンパクトで指向性の高い命令を、速やかに処理することに長けたプロセッサとして登場しています。要は、何でも処理するというよりは、命令の方向性をある程度定め、その範囲内で処理をこなすことがARMの特徴となっていました。その代わり、消費電力はミリワット単位から数ワットまでと劇的に小さな電力/パッケージングに収まるものが主流でした。しかも、それ故に製造単価や開発単価も安く、そもそもARM.LTDは製品のライセンスビジネスで利益を出しており、インテルのように開発製造販売などを一手に手がける垂直型ではないことから、多くのメーカーが使ってきたのです。


本来この2つの製品が能力的に接近することはないと思われるほど性能差がありました。しかし、携帯電話の普及によって、ARMプロセッサは急速に進化を遂げ、スマートフォン時代に、市場規模ではインテルとAMDが開発してきたx86/64系のプロセッサに匹敵するか、それを超える市場規模になる可能性が出てきたのです。(金額ベースでは、インテルプロセッサにはまだ及びません)

ARMが急速に性能を伸ばすことになったのは、スマートフォンが登場したことが大きな理由です。当初は搭載していなかったSIMDの実装や、高機能レジスタの搭載によって、たった5年ほどで多くのラインナップが登場し、多くのメーカーがARM.Ltdとライセンス契約し新しい技術の搭載を進めたのです。
結果的に、現在ようやくインテル社が持つx86に迫る程度に性能が向上しました。ただ、性能面で上回るほどになるかというと・・・。今の段階ではまだ難しいでしょう。


尚、性能の違いの結果という点は今の段階では、高性能なx86、安価で省電力なARMです。
ただ、今後もそうである保障はありません。

単価やブランドイメージの違い、販売における製造ラインの確保の問題などもありますからね。
ただ、ARMの場合は、ライセンスさえ取得すれば、製造はある程度できますから、需要があれば数は伸びる傾向があります。ただ、単価が安いため、数が大量に出ているから、売上げが凄いわけではないのです。そのかわり、一定以上の販売が伸びれば、ソフト開発も活況を呈するため、ハードの性能も総じて向上します。
そうすると、性能が上がることで単価があがるというラインに今さしかかっています。

それに対して、x86/64は元々ブランドとして一定の地位を持っている高性能汎用プロセッサです。アプリケーション資産は既にPC市場において過半数を占めており、現在はゲーム機市場でもWiiUを除けば、PS4とX-BOX Oneに採用されています。1つのプロセッサあたりの単価もそこそこ高くなります。
高性能故にダイサイズもARMとは比べものにならないほど大きなものが主流です。最近になって、そこから性能を抑えて、ARMに対抗できる製品や、ARMより少し大きくとも消費電力が低く、性能は高い製品を出すようになりました。

尚、x86とARMでは、処理方法に違いがあり、実行できるマイクロコードの記述方法にも差異があります。そのため、x86の性能が高いからといって、ARMから簡単に移植したり、その逆にARMが普及しているからといってx86の資産を簡単に移せるわけではありません。まあ、アプリケーションはOSさえ対応し、アプリケーションの開発環境に準じた実行APIを備えてくれれば良いですけど、それを支えるAPIやOSは、ハードに最適化したプログラミングをしないと、そのハードが備えるピーク性能を発揮することはできません。

といったところでしょうか?

最後に、プロセッサには他にもMIPS(MIPS)、SPARC(SPARC/旧Sun Microsystems)、Power(IBM)、SX(NEC)、IA-64(Intel/HP)などなどのアーキテクチャが存在します。性能の違いだけで見るなら、これらの製品の方が、競争する市場が似ているものもありおもしろい製品が多いですけど。MIPSなどは、最近は少し弱いですが、MIPS-III世代では、ソニーのプレイステーション2のCPUであるEmotion EngineがこのMIPSアーキテクチャでした。SPARCはスーパーコンピューター京、Power系は、そのクライアント版(PowerPC)が、Intel Macになる前にMacintoshに使われていました。
SXは、地球シミュレーターです。IA-64は・・・。不運なプロセッサ。

設計で考えるなら、プロセッサ全体を見渡すのも大事です。そして何より、重要なのは開発されるOSやアプリケーションがどういうものかを見るのが妥当です。特にそれを如実に示すのは、SXとその他のプロセッサの違いでしょう。

まず違いを知るなら以下を読むべきかと、有志が書いているとはいえ、日本サイトのただの年表とは段違いに情報があるはずです。
http://en.wikipedia.org/wiki/ARM_architecture
http://en.wikipedia.org/wiki/X86

といって、読める人なら、質問しないのでしょうけど。
概略的に説明すると、ARMは reduced instruction set computing(RISC)プロセッサです。 それに対して、x86はベーシックに言えば、complex instruction set computer(CISC)プロセッサとなります。まあ、世間では既に差はあまりないのですけど、...続きを読む


人気Q&Aランキング