Solarisプログラミング教えてチョンマゲ
一ヶ月前、父親に「パソコン買って」とねだったら[Ultra10]と書かれたマシンをくれました。 わくわくして起動してみるとなんか友達の持ってるヤツと全然違う・・・ っていうかキーボードとマウスもよく見るとなんかおかしい。 親にネットにつないでもらって調べてみるとUltra10というのは サン・マイクロシステムズというメーカーが出しているワークステーションで Solarisというシステム(UNIX?)が動いているようです。 父親にこのワークステーションで何ができるのか聞いてみると、 「ホ→ムペ→ジもメールも見られるぞ」「派手なゲームはできない」 「どうせ暇なんだからプログラムでも勉強してみろ」 とつれない答えが・・・ まあ冬休みで暇だからプログラミングを勉強でもしてみるか、と ネットで勉強しながらifとかwhileとか構造体とかポインタとか覚えました。 しかしこれを使って具体的に何ができるのか・・・? ネットで見られる情報には↑とかの基本的な使い方しか書かれて無い模様。 ここからステップアップしたいのですがどうすればいいんでしょうか? 友達にも知ってる人はいないし、 本屋で立ち読みしてもネットで得られるものと同じような基本的な部分にしか触れていません。 2ch閉鎖騒動の動画をみてUNIX板の存在を知り ここならすごいプログラマーの人がいると思い質問させていただきました。 お願いします。 >>128 今時、いきなりUNIXやらしてくれるんんて、いー学校だな。 まぁせいぜいがんばれよ。 やってほしけりゃさりげなく課題はっときなよ。 しかもアップしてみたけどアクセスできなかった・・・。 WINも満足に使えないようでは・・・ >>128 早くうpしてよ。 寝ないで待ってるんだから。 >>128 wordファイルでなくて、textファイルにしてよ。 >>128 【問題1】 1) 標準入力から読み込んだストリームで、 第1行目以降のプリプロセッサ処理行を表示するプログラム 2) 1.getcharで標準入力から1文字読み込み 2.前の文字が改行でないなら次の行を読み込み 3.前の文字が改行の場合、現在取得文字が'#'の時にstatusフラグに1を立てて 4.次行でstatusフラグが1の場合、標準出力に1文字出力する。 5.以上をストリームの終わり(EOF)まで繰り返す。 >>128 【問題2】 めんどいので端折るが、shellの勉強をすればすぐできる。 >>137 【訂正】 2.前の文字が改行でないなら次の行を読み込み ↓ 2.前の文字が改行でないなら次の文字を読み込み ^^ なんだかソフトウェア作法とか勉強したらすぐにできそうだな。 アホみたいな質問なんですが、 OS起動時に「/」がグルグル回るようなプログラムはどうやって組めばいいんでしょう? echo -n "-^H\^H|^H/^H-^H" >>143 # echo -n "-^H\^H|^H/^H-^H" -n -^H\^H|^H/^H-^H こうなるが csh% foreach n ( - / | \ - );printf $n"\c";sleep 1;printf "\b\c";end ってすると"\"のとこだけは表示されないね。 \がコントロールコードの字句解析を打ち消すのがネックか? 確かCR(13、行頭に戻る)を使ってる。こんな感じ? #!!/bin/sh while : do for c in - / \| \\ do /usr/5bin/echo "$c" "\r\c" sleep 1 done done >>137 どういう動作をさせたいのかよくわからんね。 なんとなく、「先頭行以外の行頭#の次の行からstdinをstdoutにコピー」になってる気がするのだが… なんつーか、トラブル気味なので、教えてください。 とりあえず、問題はここまで絞り込んだんだけど、 ここからがぜんぜんわかりません。 Sun.docs.comにこういう話ってでてないよね? Solaris9(64bit)で以下のコードのプログラムを動かしたとき、 必ずsegmentation faultがおこる。 struct { inta; shortb; }A; typedef A *PA; int main(){ PApa; intnum=3; pa = (PA)malloc(sizeof(PA)*num); pa[0].a = 1;//ここでsegmentation fault return 0; } このとき、ILP32ではうまくいくが、LP64(xarch=v9)ではうまくいかない。 mallocが問題だと思うんだけど、どう問題なのかがよくわからない。 Solaris9の64bitプログラムに詳しい方、ぜひぜひ教えてください。 よろしくお願いします。 ポインタの配列しか確保してねーじゃん。K&R本から(以下小言 >148 ぐは。間違えてる。 正しいのはこっち。 > struct { > int a; > short b; > }A; > typedef A *PA; > int main(){ > PA pa; > int num = 3; > > pa = (PA)malloc(sizeof(A)*num); > pa[0].a = 1;//ここでsegmentation fault > return 0; > } ちゃんと構造体の大きさを個数分確保してるんだけど、 うまくいかない。32bitだとうまくいって、64bitだとうまく いかない理由がわからない。なんでだろう??? 構造体の列をそうやって一括でmallocするのが諸刃の剣だっ ツーことは分かっているヨナ? まさか stdlib.h を include してないってオチはないよな? >>152 一括でmallocして何の問題があるつうのよ おまえ諸刃の剣って言ってみたかっただけだろ >>148 こうすればいいんだろ。 32bit、64bitどうこう言う前にK&R本が必要では? typedef struct { int a; short b; }A; typedef A *PA; int main(){ PA pa; int num = 3; pa = (PA)malloc(sizeof(A)*num); pa[0].a = 1; //ここでsegmentation fault return 0; } >>155 K&R本がどうこう言う前に>>150 をよく見ては? >>150 たぶんコンパイルオプションがおかしいんじゃない? ちゃんと64bitライブラリをリンクしてる? 下のソースでコンパイルも実行も問題なかった /* * c -xarch=v9 -o aaa aaa.c */ #include <stdlib.h> typedef struct { int a; short b; } A; typedef A * PA; int main(){ PA pa; int num = 3; pa = (PA)malloc(sizeof(A)*num); pa[0].a = 1; } >>156 >K&R本がどうこう言う前に>>150 をよく見ては? は? 言ってる意味がわかんねーよ。 155のソースでは駄目ってこと? >>158 は、155のソースにincludeつけただけじゃん。 要するに struct { inta; shortb; }A; は、 typedef struct { int a; short b; }A; だろ。 1 stdlib.hをincludeし忘れ 2 mallocの戻り値が32bit整数と見なされ 3 64bitポインタの上位(下位?)32bitがpaに格納され 4 あぼーんされ >>159 typedefが無いとコンパイルエラーになるから、 それは単なるコピペミスだと思う >>160 それ以前に>>150 のソースをそのまま コンパイルすると警告が続出なんですけど。 iconv()に関して質問させてください。 static int KONBU(char *to_code, char *from_code, const char **inp, char **outp, size_t *inl, size_t *outl) { iconv_t icv_hook; size_t ret_val; icv_hook = iconv_open(to_code, from_code); if(icv_hook == (iconv_t)-1)return(ANS_ERR);// NG Return ret_val = iconv(icv_hook, inp, inl, outp, outl); iconv_close(icv_hook); if(ret_val == (size_t)-1){ if(errno == EILSEQ) printf("EILSEQ\n"); else if (errno == E2BIG) printf("E2BIG\n"); else if (errno == EINVAL) printf("EINVAL\n"); return(ANS_ERR);// NG Return } return(ANS_OK);// OK Return } 上記のようなiconv()を用いた関数があります。 unsinged char *sb, db; ret = KONBU("JIS7", "PCK",(const char **)&sb,(char **)&db,2,8); そしてこのように呼び出しており、unchar sbには 83 31 83 32 83 34 ....といったようなデータを渡しています。 実行結果はEINVALが返ってきます。 ここで質問なのですが @第5引数の2はsbを2バイトずつ読み込むということでよろしいのでしょうか? A第6引数の8は何を指すのでしょうか? Bsbには0x81 0x31 ....というようにヘキサを読み込ませているつもりなのですが そもそも文字列で渡すべきなのでしょうか? CEINVALのエラーの意味がよくわからない。 以上4点になります。 厨な質問かとは思いますがご教授お願いいたします。 >>1 >わくわくして起動してみるとなんか友達の持ってるヤツと全然違う・・・ >っていうかキーボードとマウスもよく見るとなんかおかしい。 いつも自分が慣れたブツ以外は「おかしい」「違う」といって種類の多様性を 容認しようとしないMS中心のグローバルスタンダード的な考えは (あえていえば自分がそのような事を考えたことが無いにしても 排斥的思考を恐らくは無意識のうちに行なっているという事は) 差別や偏見にもつながりかねない重大な問題だと思うんですが、どうでせう? いやむしろ多様性を受け入れようとした結果がこの惨状なのでは? >>168 つまり>>168 が>>1 を偏見的な目で見ているから そういう解釈になるのですね? ということが言いたいわけですね。 つーか「パチョコン」といいながら「ワークステーション」といってるところで ネタ確定。 あとSPARCウザーから言わせればultra5/10はパチョコン同等。 ブリッジの下に何でもぶら下がってるのは安物。バスがスイッチなUltra60ハァハァ >>171 UPAバスの有無のことだろうけど、1cpuや2cpu程度なら あんまし意味ないっしょ 100%ネタ こんな陰険な父親いたらヤダなぁ〜(爆) >>175 そうかなー、俺はこの親父かっこえーと思うけどね。 もっとも、親父も本人が工学方面の興味をもってるから与えたんだろ。 正直言って、パソコンなんて5万程度で買えるんだからバイト代で買えるし、 ある意味、ワークステーションなんて親父が買わなければ、最初のうちは 出会えない代物だから、親父の判断は正しいと思うよ。 デモ実際にいそうじゃあない? 大学の教授とかでさー。 学校の放出品もらってきたりとか…。 漏れは先日大学からもらってきたぞい。 ども。 Solaris8+SunONE7 で ローカル時間にmsec(ミリ秒)を使いたい。 localtime構造体には、msecがなく、困ってます。 何か他のmsecのある構造体を教えてください。 また、time構造体から上の構造体への変換関数もお願いします。 #プログラム板の方にも書き込みしちゃったけど、その後、ここ見つけたんで、 #書き込ませてください。 time構造体なの? time_tとかstruct tmではなくて? gettimeofday(3C)で使うstruct timevalは マイクロ秒単位のメンバを持ってるよ。 6〜10msec程度の精度はあると思う。 ただし、gettimeofday(3C)で得られるのはUTC時間なので タイムゾーン処理は自分でやる必要あり。 >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()命令がコンパイルできません。 何か設定があるんですか? read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる