Solarisプログラミング教えてチョンマゲ
一ヶ月前、父親に「パソコン買って」とねだったら[Ultra10]と書かれたマシンをくれました。
わくわくして起動してみるとなんか友達の持ってるヤツと全然違う・・・
っていうかキーボードとマウスもよく見るとなんかおかしい。
親にネットにつないでもらって調べてみるとUltra10というのは
サン・マイクロシステムズというメーカーが出しているワークステーションで
Solarisというシステム(UNIX?)が動いているようです。
父親にこのワークステーションで何ができるのか聞いてみると、
「ホ→ムペ→ジもメールも見られるぞ」「派手なゲームはできない」
「どうせ暇なんだからプログラムでも勉強してみろ」
とつれない答えが・・・
まあ冬休みで暇だからプログラミングを勉強でもしてみるか、と
ネットで勉強しながらifとかwhileとか構造体とかポインタとか覚えました。
しかしこれを使って具体的に何ができるのか・・・?
ネットで見られる情報には↑とかの基本的な使い方しか書かれて無い模様。
ここからステップアップしたいのですがどうすればいいんでしょうか?
友達にも知ってる人はいないし、
本屋で立ち読みしてもネットで得られるものと同じような基本的な部分にしか触れていません。
2ch閉鎖騒動の動画をみてUNIX板の存在を知り
ここならすごいプログラマーの人がいると思い質問させていただきました。
お願いします。 >180
レスありがとう。
すいません、timeじゃなくてもいいです。
time_t,struct tm,hrestime,など。
標準的な関数かシステムコールで、時間を取ってこれて、それを
ローカル時間に変換できる関数があればいいです。
UTC時間だとそっから自分で変換するのに、処理にかかる時間が
問題になるかもしれないので。
できればローカル時間へ一発で変換したいところ。
> 標準的な関数かシステムコールで、時間を取ってこれて、それを
> ローカル時間に変換できる関数があればいいです。
「localtime構造体」ってのはstruct tmのことでいいんだよね?
少なくとも2038年までなら、struct timevalのtv_secをtime_tに変換すれば
localtime関数が使えるでしょ。
struct timeval tv;
time_t t;
struct tm *tm;
gettimeofday(&tv, NULL);
t = tv.tv_sec;
tm = localtime(&t);
printf("%02d:%02d:%02d.%03d\n", tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec / 1000);
> 6〜10msec程度の精度はあると思う。
訂正。実測したら20usecくらいの精度はあるみたい(@Blade 100)。 >182
返事ありがとう。
まさしく求めていたもの、そのものって感じです。
ありがとうございました。
Solaris8のSun ONE7 でディレクトリの存在チェックをするには
どうしたらいいでしょうか?
opendirを使おうと思ったんだけど、DIR *が大きさ不定?な
構造体らしく、どうしたらいいかわかりません。
簡単にディレクトリの存在(ある、なし)をチェックするには
どうしたらいいか、教えてください。
exec(ls)のようでないものをお願いします。
Solaris8ってlibpthread.a無いんですか?
Linuxだとちゃんとあって、スタティックリンクできるんですが。 Solaris の場合、スタティックリンクできない。
これは pthread 回りでシステムコールインターフェースの変更が
あっても、libpthread.so でその変更を吸収するためなので、
我慢しる。
処理時間が一定時間を越えた場合には、強制終了するように、スレッドとシグナルを使って、
以下のようなプログラムを組んでいます。
しかし、シグナルハンドラを無視(起動しない)もしくはシグナルの無効化ができません。
どうしたらよいでしょうか?
・初期設定
・スレッドA起動
( ---> シグナルハンドラ(SIGALRM)設定、インターバルタイマーセット )
( ---> タイマー待ち ---> 時間が来たらハンドラ起動 ---> ハンドラ(abortで強制終了) )
・処理B
・処理Bが時間内に終了
・スレッドA終了処理
( シグナルハンドラを再設定 ---> インターバルタイマーリセット )
( スレッドAをキャンセル )
・処理続行
このとき、シグナルハンドラの再設定し、スレッドAを終了させると、ALARM CLOCKで終了。
スレッドAを終了させて、なおかつ、ハンドラを起動させないようにするためにはどうしたら
いいか教えてください。
なんか、Solarisの中味(システムコール?)について、よくわかってないので、変なこと書いてる
かもしれませんが、よろしくお願いします。
>>191
そのスレッドAってのは時間監視だけしてるの? それとも処理BってのもスレッドAの仕事?
時間監視だけなら、シグナル使わないでスレッドAをその時間だけ眠らせておけばいいんでない? >>192
> >>191
> そのスレッドAってのは時間監視だけしてるの? それとも処理BってのもスレッドAの仕事?
> 時間監視だけなら、シグナル使わないでスレッドAをその時間だけ眠らせておけばいいんでない?
そうしておいて、B側で処理が間に合ったらフラグをセットして、スリープから起きてきたA側がそのフラグをチェックすればいいんじゃないのかな?
レスありがとう。
>192,193
スリープでもいいかなと思って、暫定的にそのような処理にして、動かしていました。
しかし、他にもいくつかのスレッドが立ち上がっており、タイマー待ちができない状態になりました。
結局、なんとか今日解決したのですが、どのようにしたかというと、以下のような感じです。
(SIGALRMは他のスレッドで使用するため、ほかのシグナル(SIGUSR1)に変更することになりました)
スレッドAは時間監視セット処理のみ行う。
処理Bはタイマーによって監視され、一定時間経過したら、ハンドラによって強制的にプロセスごと終了させられる。
・初期設定
・スレッドA起動
( ---> シグナルハンドラ(SIGUSR1)設定、timer_create(TimerID), timer_settime() -----> スレッドA終了)
( 時間が来たらハンドラ起動 ---> ハンドラ(終了処理後、abortで強制終了) )
・処理B
・処理Bが時間内に終了
・タイマー削除処理(timer_delete(TimerID))
・処理続行
以上、こんな感じです。
ありがとうございました。
スレッドとシグナルを併用するってぇいうのが間違いの元 Solaris Systems Programming
ttp://www.amazon.com/exec/obidos/tg/detail/-/0201750392/
翻訳期待の本 Sunblade 100のCPUは、sparc64でつか? 何が64bitかはわからんが、まあ普通は64bit CPUに分類される。 >>200
ありがとうでした。
いや、ちょっと今ビッグエンディアンとリトルエンディアンのテストしたかったので、
x86とSparcを使用して64bit,32bitデータがどうなるか調べたかったのです。
おかげでエンディアン問題に影響しないコードが書けました。m(_ _)m そりゃそうだろ。
大抵のプログラムはエンディアン問題には影響*しない*。
影響*される*ことはままあるがな。 とりあえずあれだ、漏れが適当なWindowsマシン(ライセンス付き)送ってあげるから
そのマシンと交換してほしいよ。マジで。 Puttyを使ってsshで接続後、makeとかしてるんですけどセッションが切れてもmakeし続ける方法ってないんですかね?
makeに1、2時間かかる間にPuttyやネットワークが落ちてもサーバー側に問題がなければmakeしててほしい。 screen 使ってでたっちするか
nohupするか。
なんで、なんでなんで。
おすぎですっ。ぴーこですっ。
ゆーたいりだつっ。
ざ・たっち。
>>204
文字をintで扱うからエンディアン影響するんじゃ?
キャストってスペックにだけ影響するの?
一ヶ月前、父親に「パソコン買って」とねだったら[PC8801]と書かれたマシンをくれました。
わくわくして起動してみるとなんか友達の持ってるヤツと全然違う・・・
っていうかキーボードとマウスもよく見るとなんかおかしい。
親にネットにつないでもらって調べてみるとPC8801というのは
NECというメーカーが出しているワークステーションで
N88BASICというシステム(Microsoft?)が動いているようです。
父親にこのワークステーションで何ができるのか聞いてみると、
「ホ→ムペ→ジもメールも見られるぞ」「派手なゲームはできない」
「どうせ暇なんだからプログラムでも勉強してみろ」
とつれない答えが・・・
まあ冬休みで暇だからプログラミングを勉強でもしてみるか、と
ネットで勉強しながらifとかwhileとか構造体とかポインタとか覚えました。
しかしこれを使って具体的に何ができるのか・・・?
ネットで見られる情報には↑とかの基本的な使い方しか書かれて無い模様。
ここからステップアップしたいのですがどうすればいいんでしょうか?
友達にも知ってる人はいないし、
本屋で立ち読みしてもネットで得られるものと同じような基本的な部分にしか触れていません。
2ch閉鎖騒動の動画をみてUNIX板の存在を知り
ここならすごいプログラマーの人がいると思い質問させていただきました。
お願いします。
PC88でwebもメールもできるんなら、それはたしかにわくわくするなあ。 PC88ってN88Basicしか動かんのじゃないの?
DOSの前だよなw
おれSRmkU持ってたけど。単なるゲームマシンだったな。なつかぴ。 CPUはZ80(相当)だから、CP/Mもあったらしいよ。
UZIXも動けばおもしろいんだけどね。 おお CP/M ね。
あったなぁ。 俺は日電CP/M持ってたもんね。
あの頃のソフトはほんとバケモノのように良く出来てたよ。
Fortran,PL/I,CPBOL,C つか、ふつー PC-8001 で CP/M だろ?
メディアは8インチフロッピーw お父さんのクオリティに感動!!
てか絶対WindowsPCより高い金出してるよな 特定のウィンドウ1〜3を指定した順に上位スタックするようにしたく・・・
※ウィンドウは他にも多数あるという前提で
Display *dsp;
Window win[3];
int w_num;
w_num = 3;
wim[0]=123; /* アプリ1のWindowID*/
wim[1]=456; /* アプリ2のWindowID*/
wim[2]=789; /* アプリ3のWindowID*/
/*IDは引数で渡されたものを数値変換したもの、または、*/
/*共有メモリから取得した値。ここの例では省略している*/
dsp = XOpenDisplay(display_name);
XRestackWindows(dsp, win, w_num); /*指定した順でウィンドウを再スタック*/
と、したのだがウィンドウがピクリとも動きませんでした。
どこが誤っているのか、なにか処理が足りないのかが判りません。
どなたかお判りになる方は居ませんか?
>>221
適当なWindowManagerのソース見てみたら?
自分がオープンしたウィンドウじゃないから
うまく動かないんじゃね?
WindowManager用に用意されてる関数があったような
気がする。 >>223
サンクス
WindowManagerみてみる。
いろいろ試してみたけど
CygwinでWindowManagerの介入阻止してやると
動きそうな幹事。
ただ、他のWindowManager上で試すとまったく
動かなかったりする。
よくわからん。 >>224
VictorのMSX2にもデュアルCPUなHC-95ってのがあったぞ。
>>222
あのね、子供がしたことに対して親が責任を取るというのは当然でしょ。
それと全く逆のことを考えればいいのよ。
歴史的な問題の場合、上の世代の過ちに対して、下の世代の人たちが責任を取らなくちゃいけないの。 なるほど、失敗した上の世代を吊るしていいということか nanosleep()命令がコンパイルできません。
何か設定があるんですか? No manual entry for nanosleep さがしもせず「ないからわかりません」とかほざくやつはしねばいいとおもうんだ
ttp://www.freebsd.org/cgi/man.cgi >>233
スレタイよめ。
あと、古いSolarisだとnanosleep()は無かったと思うぞ。 さあ早く select()使ってnanosleep()を実装する仕事に戻るんだ、、 select()命令を使ってnanosleep()命令にする(?)って、そんな設定があるんですか? select() のタイムアウトを nanosleep() の代わりに使うという話でしょ。 PASS= に/usr/gnu/binを適応してるのに
xmkmfのジョブが実施できません><
ヘルフお願いします setコマンドで本当にそのパスを食ってるか
rehashしてみるとかwhich xmkmfしてみるとかさぁ Solaris-7.0 x86 なんですけど、最新版に上げるための手順を教えてください。 C言語を静的リンクするのに、オプションは -staticじゃ駄目なんですか?
何かエラーが出るんですけど >>246
その、コンパイラ(リンカ)により異なるオプションを付けても
エラーが出るんですけど エラーメッセージを書かないのは、宗教上の理由からですか?
>>245
これ、なぜそうなるか知ってる人ならエラーメッセージ関係なしで答えられるよね Solaris10ではlibc.aが提供されていない。 だったらインストールCDからlibc.aを追加すればいいだけでは? Solaris10で開発した事がない老害か? とっとと引退して判子押しでもやってろ。 >>255
SUNWがたくさんあり過ぎて探すのが大変です。-staticのSUNWを教えて下さい。 >>255と>>257は最近の事情を知らない、死に損ないジジイなので無視しましょう。
Solaris10ではライブラリが提供されていないから、スタティックリンクは出来ません。 だから、回答のSUNWだけ教えろよ。能書きは不要。 みんないじわるだなぁ
>>245
SUNWarcに入ってるよw >>265
感謝!!!!
SUNWを入れたら静的コンパイラできましたぁ!!!! tarファイルの中のファイルを削除したいのですが、solarisにはdeleteオプションが無いようなので、このオプションを使わずに削除するにはどうすればいいのでしょうか? /usr/sfw/binにgnuのtar入ってなかったっけ?
一旦展開してアーカイブ作り直すとか >>269
それは難しいと思います。
パイプで渡せば出来そうな気がするのですが。具体的にどう書けばいいのかわかりません こんなんでいいのか?
$ ls
test1 test2 test3
$ tar cf - test* |perl -MArchive::Tar -e '$tar=Archive::Tar->new(\*STDIN);$tar->remov\
e("test1");$tar->write(\*STDOUT)' |tar tf -
test3
test2
>>272
ありがとうございます。今環境がないので今度客先のaixで確認してみます。 >>272
はじめにAIXのスレで質問して、ついでにシェルスクリプト総合で質問したものですが、
http://hibari.2ch.net/test/read.cgi/unix/1290209379/235-236
でシェルスクリプトを書いてしまいました。
どうも別の人も質問したり、回答したりしているようです。
perlは使ったことがないのですが、便利そうですね。
しかし、会社のAIXにperlはインストールされているのだろうか…
awkとかsedを使っている人はいるんですけどね。
汎用性はawkとかの方が高い気がしますが、perlの方が高機能なんですかね。 ちなみに268,271,273は私ではありません。
スレチですがAIXで動かすのが目的です。
自宅にはCent OSとFree BSDの環境があり、Cent OSでdeleteオプションが使えることは確認しました。
せっかくシェルスクリプトを書いたので、当面はそれを使うつもりですが、
Cent OSでperlは使えると思うので、272のコードも試してみようと思います。 >>272
実行してみたところこんな感じでエラーになりました。
[root@centos ~]# touch test1 test2 test3
[root@centos ~]# tar cf - test* |perl -MArchive::Tar -e '$tar=Archive::Tar->new(\*STDIN);$tar->remove("test1");$tar->write(\*STDOUT)' |tar tf -
Can't locate Archive/Tar.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 \
/usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl \
/usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .).
BEGIN failed--compilation aborted.
tar: これは tar アーカイブではないようです
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました
どこが間違っているのでしょうか? 「古文書のありかを突き止められません」も読めないゆとりか? Can't locate Archive/Tar.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 \
Archive::Tarがインストールされていない。
$ cpan Archive::Tar
かな? >>279
ありがとうございます。動いたようです。
しかし、会社では使えないんだろうな…