2
CPU使用率を取得する方法を教えてください。
>>4 早速の回答ありがとうございます。
Linuxの場合はどうすればよいのでしょうか?
cursesで文字列でないワイド文字を1文字出力する関数を教えてください
unix板にも、linux板にも、同じスレが有るんだな これが
>>7 ncursesのmanpageのncurseswの項目を読んでください。
10 :
忍法帖【Lv=16,xxxPT】 :2011/04/27(水) 17:45:17.96
>>6 早速の返信ありがとうございます。
そのファイルを読み込むと言うことでしょうか?
ファイルを開く操作は重い操作なので、できれば何か関数で取得できるとよいのですが
お前が読め
12 :
デフォルトの名無しさん :2011/05/04(水) 02:32:26.37
XLibを使ったプログラムを作ってるんだけど、 RootWindowでルートの画面を取得して縦横のサイズを見ると、 0になるんですが、スクリーンのサイズを取得する方法を教えて下さい。
取得できました。
どうやって?
>>14 該当箇所を消してしまったので、覚えてませんが、XGetWindowAttributes
の引数にルートを渡すと、スクリーンのサイズが取得出来ました。
ところで、リモートのXにログインする方法を教えて下さい。
VNCモドキを作ってるのですが、そもそもXの認証を行う方法が分かりません。。
xauth関連のコード読んで。 ただ独自接続管理ならsshのX forwardingを参考にしたほうがいいかもしれないが。
>>16 XCBのソースを見ると書いてありますね。
18 :
デフォルトの名無しさん :2011/05/11(水) 09:22:26.52
コマンドラインプログラムでタイマーを使って割り込み処理をする方法はありませんか?
コマンドラインでプログラムできるシェルっていうと、N-BASICとかそっち方面ですかね。 UNIXには無いけど、インタラクティブなLL使えば出来るんじゃないかな。
>>18 ?
タイマーの関数自体、guiとかcuiとか関係ないと思うんだが
alarm(3)
libeventはやってるみたいだけど libevとかもあるよね? 結局 select,poll,epoll,libent,libevどれがいいの? でやっぱりサーバとしては、マルチスレッド使うよりいいわけ?
今どきシングルコアしか使えないサーバプログラムなんて寂しいから、 シングルスレッドにするなら、クラスタリングの仕組みを用意して 負荷分散する等の余計な手間が必要になる様な・・・ 一方、マルチスレッドで作っておけば、スレッド間のデータの受け渡しも 簡単だし、コンテクストスイッチも軽いし、プロセスの管理も簡単。 C の標準ライブラリにマルチスレッドの関数が入る時代だしね。 ただマルチプロセス前提なら、ノードを跨いだスケールアップを 狙えるのはメリットかも。
>>23 ちょ、ちょっとまって。マルチスレッドを気に入ってるみたいだけど
ちょっとおまえのスキルを確認させて。
C10K問題のテキスト(英文でも訳文でもいいから)読んでみた?
最近(でもないか。)mixiがおちたmemcashedのとらぶる知ってる?
あ、そもそもmemcashedのlibeventのトラブルはしってる?
libeventとかのベンチマークテストとかやってみてるの?
スティーブンスンは読んだことあるよね?
「オンラインゲームを支える技術」は読んだ?あそこにかいてある内容はどう思う?
>>24 何だか一行目から勘違いしてるみたいだけど、マジレスした方が良いの?
>>23 > 一方、マルチスレッドで作っておけば、(略)
> コンテクストスイッチも軽いし、
pgr
自分の意見も言えないのに突撃してくるのは鬱陶しいから勘弁してくれ 君は議論してるつもりかもしれないけど・・・
>>25 遅くなりました。マジレスお願いいたします。
>>28 結局マルチコアマシンに対応しないといけないから、
ロードバランシングする方法を考えておくか、
最初からマルチスレッドで作っておくしかないよ
という話なんだが・・・
>>22 が何のサーバを想定しているのか知らないけど、
例えばウェブサーバだとこんな感じかな?
nginx : load balancing + worker thread
lightty : multi process (
http://redmine.lighttpd.net/wiki/1/Docs:MultiProcessor )
node.js : no feature => 普通はロードバランサーを手前に置くよね
至極普通の話をしているだけなのに
>>24 みたいな人が
湧いてくるのが理解出来んわ。C10K って何十年前から
言われてると思ってるんだろうね。。。
>>29 c10問題は知ってる口調だけど原文は読んだのか?
そこではマルチスレッドはもはやこの問題に対応できるように設計されてないとかいてあるだろうに。
そこでシングルスレッド、ノンブロッキング、イベントドリブンが今の潮流なんでしょ?
そんな潮流はマルチコアプロセッサが登場する以前の話でしょ?
>>32 それ、返事になってないし
結局、マルチコアとの相性については見なかった事にするか、マルチプロセスか
マルチスレッドかロードバランサーか、選ぶしか無いんですよ
それが今の潮流
>>31 OSのマルチスレッドが一般化してからの一頃は1クライアントに1スレッドを
割り当てるサーバも多く書かれたが、C10Kの状況ではこのモデルは破綻する。大抵のOSは少なくとも以前はそのような非常に多数のスレッドを扱う状況を
あまり想定していなかった
大抵の OS って Linux 2.2 とかだろ
>>33 すごい自信だけど、実績があっていっている?それともお勉強しましたレベル。
実績があるならどんなサーバの実績でどのくらいのクライアントをさばいたか教えてください。
かわいそうだからそっとしといてあげなよ
かわいそうだからそっとしといてあげなよ
41 :
デフォルトの名無しさん :2011/05/14(土) 19:38:50.22
過疎スレあげ
わんわん
43 :
デフォルトの名無しさん :2011/05/15(日) 18:15:10.31
かわいそうだからそっとしといてあげなよ
44 :
デフォルトの名無しさん :2011/05/18(水) 05:01:47.06
計算が終了したら、Twitterに自動的にtweetするようにしたいのですが、一番簡単な方法を教えてください。
何故ここに…? TwitterだったらPHPとかPerlとかPythonとかRubyとかの いわゆるWeb系言語のスレとか、それかWebProg辺りになるんじゃないのか…?
49 :
デフォルトの名無しさん :2011/05/19(木) 22:30:53.13
大容量のファイルに対して、read()システムコール:ssize_t read(int fdesc, void *buf, size_t nbytes) をしてみた所、失敗してerrno=22(EINVAL)が返るのね。ちなみに、movファイルでサイズは7GBぐらい。 なんで失敗するのかご教授ください。
どこの馬の骨かわからない奴に教授する気はない。
そうだよな。どこのだれぐらい言わないとな
>>49 教えて欲しければ、もう少し詳細に書けよ。
あと、man readくらいは読んだか?
CPUの詳細情報は/proc/cpuで取得できますがGPUの詳細情報はどこで取得できるのでしょうか?
54 :
デフォルトの名無しさん :2011/05/20(金) 06:45:35.26
popen/pclose系とシェルコマンドの連動(やりたいことは例えばls . | grep "hoge")で分かりやすいサイト(英語可)を教えてください。 言語は何でもいいですが、できればC言語ではなく、RubyやPythonで簡略化されたものがいいです。 ていうか、こういうCS以外の学科で教えなさそうな話は、本とかで勉強したほうがいいのでしょうか?
X Window Systemのアプリ作りたい gccで作れるの?
gcc 以前に、そんなこと聞いてる奴には難しいと思う。
>>57-58 レスありがとう
作れるけど難しいのか
やりがいがありそう
どこまでも能天気な奴だ
最初から簡単に作れる奴なんか居ない 誰でもHello Worldからステップアップするもんだ
誰も聞いてない
>>62 へー、Gtk+ に JavaScript バインディングなんてあったんだ
見た感じ簡単そうで良さげだね
知らんかった
>>62 gjs より、seed のほうが Gnome 標準っぽい。
今日ブ○クオフいったら93年発行のXウィンドウプログラミング1って本が800円で売ってたから買うか迷ったけど買わなかった ウィンドウマネージャの作り方とか載ってんのな 現状800円は高いお
なんだブックオフか 伏せる意味あんのか馬鹿
むしろこれは伏せてないw
ubuntuとかエンドユーザ向けのlinux流行ってるとか言ってるわりにはunix向けアプリの作り方の本とか書店で全然見かけないな
要するに、パソコンといえばBASIC、時代からMS-DOS時代に移行したような、 プログラミングなんかしない「エンドユーザ」に流行ってる、ということなんじゃ。
Linuxなどで開発する人は、自力で調べちゃうし。
xdmみたいなログインマネージャ作ってみたい
どうぞ。
ぶ[F7+Enter]まる[Space+Enter]おふ[Space+Enter] マンドクセーw
もしかしてJava使えばX用アプリ簡単に作れたりする?
お前が簡単と感じるかどうかは別問題
GUIアプリは作れる Xプロトコルのプログラミングをしたいならおすすめしない
>>76 最近一番簡単だと思うのは、GNOMEのJavascriptバインディング。
gjsってやつ。
cとgladeでおk。
まったくの初心者です sygwinを使っているのですが VC++で作った.slnファイルをsygwin上で実行するにはどうすればいいんでしょうか? ちなみにプログラムにはMFCが使われています
build.exe にパスを通す
getopt() の、それ以上オプションが無いときの戻り値は何故 -1 なのでしょうか? '\0' をオプションにすることって、たぶん無い…ですよね
特別なケースは-1にすることがUNIXのAPIでは多いから。
なるほど、他の関数と同じような仕様にしたんですね ありがとうございました
getchar()のEOFと似たループになるよね。
>>83 >'\0' をオプションにすることって、たぶん無い…ですよね
多分無いと思うけど、制限は可能な限り少ない方がいいと思ったんじゃね。
利用者は、極まれに開発者が思いもよらない使い方することあるから。
cutみたいにオプションでデリミタとかセパレータを指定できるコマンドを考慮してるとか? 普通に"\0"を渡せばヌル文字で解釈してくれそうだけど。
確かに、そういったことも考慮すると使えるに越したことは無いかも知れないですね。参考になりました。
SSHとかではなく、自分の作ったプログラムで認証したいんですが、 UNIXの認証の仕組み(何らかのシステムコールを呼ぶとか?)を教えて下さい
authenticationとauthorizationのどっち?
キーボードってJISとUSどっちがいい?
このみ
97 :
デフォルトの名無しさん :2011/08/09(火) 02:45:04.05
おいしいチャーシューの作り方を教えてください
1. 髪を伸ばしてオールバックにする 2. 裸になり黒パンを履く 3. 相手に喧嘩を売って自分からキレる
Makefileで a.h : b.h みたいなのが書いてあるんですが、 これって何なんでしょう?
どっかで見た質問だったと思ったらここか
>>100 a.h は b.h に依存している
という意味です
起動してから一定時間実行したら終了するプログラムは どのように作るのが普通なんでしょうか? 実行する内容としては例えば1時間というパラメータを与えられて起動されたら その間ファイルを開いて読み取って閉じて次のファイルを読み取って という事を繰り返して1時間経ったら自ら終了する感じで。
alarmしてSIGALRMのシグナルハンドリング。
お手軽にループの中でtimeで現在時刻もらって指定時間時間経過したらそのループ抜けるとか
unix初心者です。 リモートホストからローカルホストに戻るコマンドを教えてください。 ググってもわからなかったです。 プログラミング以前の問題で申し訳ないですが、 よろしくお願い致します。
exit
>>107 ありがとうございます。
助かりました。
>>104-105 ありがとうございます。
結局その2つになってしまいますよね。
シグナルは確実に止まるけど1個しか使えないし、時刻を取得してというのはその間に実行する処理の量によっては時刻取得のオーバーヘッドがシャレにならんかったり指定した時刻からかなり遅れて終了したりとかありますよね?
>>109 だから、(何にでも言えるが)汎用的な方法はない
対象に合わせて適切な方法を選ぶしかない
>>109 外部からジョブを終了させるってことが、
システム、言語、環境に関わらず、
「本質的に」難しい仕事ってのは理解している?
スレッドを外から終了させるようなAPIが
全く推奨されてないのと同じ理由なんだけど。
>>109 オーバヘッドを気にするならタイマ用のスレッドを作りなされ。
1時間寝てから通知すればよいでしょ。FD でも cond でも。
つまらんことを気にする場合、大体はどうでもいい事にこだわっていると思う RTOSじゃないしファイル読んでる時点で1sくらい普通にずれるべ
1時間経ったらがなんで1時間キッチリにせんといかんのだ?
109で >時刻を取得してというのはその間に実行する処理の量によっては >時刻取得のオーバーヘッドがシャレにならんかったり指定した時刻から >かなり遅れて終了したり とかゆってるからシビアな条件があるのだろう
後始末のないworkerなら強制的に止めてしまえばいいし、 後始末が煩雑ならworker側でyeildするのがいい。
SIG_DFLの時の動作がプロセス停止になっているシグナル(SIGTSTPとか)が 時々止まらないことがあるのはなんでだべ?
>時刻取得のオーバーヘッドがシャレにならんかったり ループの根元でやりゃ、負荷はバカにならんわな お手軽にやったけど、何か解決方法はないかという これ以上何も考えません的なところが素敵
>>117 ブロックしている瞬間があるんじゃないの?
>>110-118 ありがとうございます。
はい、現状は1時間を1本計れれば良いけど、それを1つのプロセスのままで複数の1時間を
スタートの時刻が異なっても計れるようにするには初めからどのような作り方をするべきかとか
1時間をまたいで読み取り中だったデータは捨てるのか全部入れるのか1時間ちょうどの部分で
切るのかとか、ちょっと基本的な点でアレ?とか思っちゃったのでちょっと質問してみた感じでした。
最後の2行は新しい質問か?初耳だが、そんなのプログラムに要求されていることによるだろ。 どの挙動をすべきかなんて作ってる奴にしか分からん。
最初の2行はお礼では。
真ん中の二行は…てやかましいわ!
wchar_tって使ってる人いる?
canna以外で見たこと無いけど
wchar_t をワッッチャァァァって発音したら、 職場の人間全員が ( ゚д゚) −> Σ( ゚д゚ ) になった どうも _t を発音しなかったのがまずかったみたい
あー・・・ なるほど・・・ 大事なところだもんな・・・
だぶちゃーてー(!ティー)だよな。
だっちゃ
たしかLinuxとかは一文字4byteなんだよねwchar_t。いやだなあ
なにいってんのこの人。ダサい。
>>124 C++ では std::wstring を使ってプログラムを書けば無問題、
そんなふうに考えていた時期が、俺にもありました。
VC++だと問題ないけどね。Unix系だと罠がいろいろとありそうな・・
>>133 いまどきUnix系でプログラムしてる人は少数派だろ
それをこのスレで言うかwww
AndroidやiOSはUNIX系かね? 古典的なAT&T由来のC APIではないけれど。
全ての作業をWindows上でおこなうのは少数派かな
iOSはしらんけどAndroidはnix系だな
140 :
67 :2011/10/04(火) 15:07:33.28
今日行ったら200円になってたから思い切って買った
141 :
67 :2011/10/08(土) 01:51:21.45
ちなみに書籍タイトル正確なのは Xアプリケーションプログラミング1 xlib編 92年発行の東工大の教授の本だ 19年も前の本だけど19年前から顔文字ってすでにあったのな 19年前って俺まだ小学校低学年だったからパソコンとかよく知らんかったけど X11R5が出たばっかのころのらしい、今のに使えんのかな
>>141 これ?
http://www.amazon.co.jp/dp/4883170225/ なつかしい。
自分は当時大学生で、大学で何百万もするUNIXワークステーションを使って
サンプルとか打ち込んでたなあ。今なら安PC+Linuxでより快適にできる。
LAN経由で近くで作業している奴のディスプレイにイタズラの画面を出したり...
一般家庭はともかく大学にはインターネットの電子メールとかネットニュースとかが
既にあったし、顔文字とかAAも使われていた。www(草じゃないよ)が出てきた前後だな。
大学のマシンにサーバー立ち上げたっけ。エロのw 今ならマスコミ沙汰になって
退学処分か?
Xのプログラミングから離れて久しいのでアレだが、Xlibはあんまり変わってないんじゃ?
すなわち今でも使えるのでは。あえて今から低レベルなものを使ってプログラムを
書きたいのであれば...
dwm, xmonadといったタイル型ウインドウマネージャや dmenu, dzenなどのシンプルなランチャの流行もあって 今でもXLibプログラミングは熱いですお
>>143 そうなんだー。
今dwmのソースをダウンロードしてみたらソースファイルが一つだけ...
こんなんでいいんだ。
サーバはXを使うとして、ウインドマネージャを自作するなんてのも面白そうだね。
ウィジェットとか言い始めると敷居が高いと思われるので...
145 :
デフォルトの名無しさん :2011/10/08(土) 08:35:55.73
age
そのスレにcsh使いを誘導しないで欲しい cshのmanのヒアドキュメントを読む。echoで書く。cshを捨てる(推奨)
インタラクティブに使ってるなら $ cat >Makefile 中身入力、改行 Ctrl+D
お悔やみ申し上げます
_____ .ni 7 / \ ご冥福をお祈りします l^l | | l ,/) / /・\ /・\ \ .n ', U ! レ' / |  ̄ ̄  ̄ ̄ | l^l.| | /) / 〈 | (_人_) | | U レ'//) ヽっ \ | / ノ / /´ ̄ ̄ ノ \_| \rニ | `ヽ l
まちごた まいいや
155 :
デフォルトの名無しさん :2011/10/18(火) 17:07:46.91
>>70 ライセンスの問題とか絡むからじゃね?
無料で公開すべきものを本を買うとか金銭発生するし
>>70 「unix向けアプリ」というのはたとえばGTK+とかでアプリを作るという事でいい?
いくつか本が出てたと思うけど。実際に本屋にないという意味?
隣のおっさんうるさい
じゃあ転職しろ
そんなこたーない。
「コマンドラインアプリ」ってあんまり聞かないな
cursesを使ったようなやつ?
単にコマンドって言うもんね。
Xアプリケーションプログラミング1 xlib編で書かれていたアプリケーションとは 不特定多数のユーザに使われることを前提として作られた,"汎用的で便利なプログラムのことをアプリケーションと呼ぶ" (引用 p.27 l.17~18) だそうで X用のプログラムは必然的にアプリケーションと呼ばれるだけの性質を持つそうです
Ach, so.
>>166 流れからすると
>>67 の発言みたいで、ジジイじゃないっぽいけどw
自分はたぶんジジイだがw X11のプログラミングの本で、これみたいに比較的
気楽なノリで始められる本はあまりなかったように記憶しているのだが。
何かいい本をご存知ですか?
そもそもXlibを使うこと自体が骨董に属するんだったりしてw
何か違うもの、たとえばOpenGLとかでやった方がいいのかな?
大昔でもアプリ向けにはathenaとかmotifとか使ってたんでは。 あとOpenGLと比べるのもなにかおかしい気が。
>>166 の2巻目はAthenaウィジェット編だからな
当時もXlibでアプリ作るとか無いだろ
>>168 今はXlibの話をしてるつもりなんで逆にAthenaとか言い出す方がちょっと違う。
あ、イベント処理とかもいるからGLUTもか。
>>169 Xlibだけで自分でボタンやメニューを作ったりしたのはいい思い出w
ああそうなの、アプリの話かと思ったわ。すまんね。
67は今やオールドテクノロジー化したXlib本を買って何がしたいのやら
オールドテクノロジーってわけじゃないけども。 今時のGTKアプリだって下位層で使ってるんだから。 「低レベル」ってのが適切な形容詞だと思う。
時代はXlibからXCBだと聞いた
EmacsやらNetbeansやらをいじっていて気付いたのですが, 大昔(EclipseもNetbeansもなかった頃)のGNUとかオープンソース界隈のエロい人たちが使っていた IDE(統合開発環境)ってどうなってたんでしょうか? IDEなんか使ってなくて,CUIに仮想デスクトップ+vi/Emacs+gcc/gdbとか普通にありそうですが…
いまはemacsにもIDEが乗っかってる時代だからな
フルカスタマイズしたEmacsがIDE相当だな 結構色んなこと出来るよあれ、環境作るのは面倒いけど
仮想デスクトップがscreenか
・エディタの無い時代 ソースは紙に下書き、パンチカードに清書して入力するよ! 出来上がったソースは印刷してチェックだ! ジジイ達が処理の切れ目に書く馬鹿デカいコメントはこの時代の名残りだよ! だって印刷物は関数のところへジャンプも、そもそも検索も出来ないからな! ・ラインエディタ時代(edなど) 環境によっては標準出力はプリンタかも知れないよ! でも入力してるその場でソース見たり、エディタによっては検索も出来るよ!便利! ・スクリーンエディタ登場(viなど) なんと行の途中の文字だけ編集したり出来るよ! これで長い行もサクサク編集出来るね! ディスプレイもみんなの分あるから、超便利になったよ!
>>181 プログラム書いた紙(コーディングシート)はパンチャーのおばちゃんにパンチしてもらうんだぜ。
その後の修正は自分でパンチするけどね。
前の職場にリアルでリアルでパンチャーやってた頃があるって言ってたパートのおばちゃんが居たな…
emacsが無かった時はvi使ってたよ いまでも普通にvi使う echo>> だけで済ませることもしばしば
185 :
177 :2011/11/06(日) 18:53:49.18
このスレのエロい人thx! 複数の言語で何か処理してファイルで読み書きするというレベルに達したので,次のレベルに進みたくて調べたけど 大体予想通りということがわかりました. 昔と違って分野が複数ある(並列化一つとってもマルチスレッド,マルチコア,マルチプロセッサにGPU)ので 進む方向性を選ぶのが難しい.
>>185 ハードとソフトが混ざってんぞ
マルチスレッド、分散処理、GPGPUな
あ、あとSIMDかSSE命令などのデータ並列命令な
>>185 >昔と違って
本質的にはそんなに違わんw
>進む方向性を選ぶのが難しい.
何かをどうしても高速に計算したいとかあるわけじゃなく、お勉強でやってるだけなら
かたっぱしからやっとけばw
馬鹿には無理
189 :
177 :2011/11/07(月) 00:36:34.52
情報系の院生として研究に従事していますが,自分の立ち位置は「他学問から対象問題を収集,複数の手法を組み合わせて解く」こと.
問題に対する解法の有効性を検証するのが仕事なので,シンプルに組んでそこそこ新しい計算端末で4日ほど計算させる.
有効性が検証されたら,複数の小問題として分割して学部生の卒論として展開されます.
なのでGPGPUやMap-Reduceなどの先進的な手法を自分で扱いたいのですが,そこまで時間を確保できない.
>>186 すみません,利用する選択肢で書いてしまいました.
ただGPGPUなどもそうですが,自然科学分野の対象問題を性能を引き出すように構築するのって
すごく難しい(この変数が何バイトで…と考えなければならないので)
>>187 昔といってもベーマガ全盛期のあたりを指しています.
教科書を元に脇目もふらず,ロジックを検討できるのはいいなぁと思います.
今ではWebアプリ(phpからJSP,RoRなど)やクラウドも登場して選択肢と夢ばかりがひろがりんぐです.
>>188 そのとーりだと思います
コンパイルが通らなくて困っています。 OS BSD/OS 4.3 コンパイルしたいもの libfetch コンパイラgcc 2.95.3 cc -O2 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wno-uninitialized -Wreturn-type -Wcast-qual -Wpointer-arith -Wwrite-strings -Wswitch -Wshadow -Werror -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 -DDEF_UMASK=0022 -I/usr/pkgsrc/bootstrap/work/wrk/pkgtools/pkg_install/work/libarchive/libarchive -I/usr/pkgsrc/bootstrap/work/wrk/pkgtools/pkg_install/work/libfetch -DHAVE_NBCOMPAT_H=1 -I/usr/pkgsrc/bootstrap/work/wrk/pkgtools/pkg_install/work/libnbcompat -I. -D_LARGEFILE_SOURCE -D_LARGE_FILES -DFTP_COMBINE_CWDS -c common.c cc1: warnings being treated as errors common.c: In function `fetch_write': common.c:639: warning: function declaration isn't a prototype というエラーでコンパイルが通りません common.cのソースは #ifndef MSG_NOSIGNAL #include <signal.h> #endif
ssize_t fetch_write(conn_t *conn, const void *buf, size_t len) { struct timeval now, timeout, waittv; fd_set writefds; ssize_t wlen, total; int r; #ifndef MSG_NOSIGNAL static int killed_sigpipe; #endif #ifndef MSG_NOSIGNAL if (!killed_sigpipe) { signal(SIGPIPE, SIG_IGN); killed_sigpipe = 1; } #endif 639行目はsignal(SIGPIPE, SIG_IGN);になります。 man signalをした所 void *signal(sig,func()); void (*func)(sig) と書いてありました。 <sys/signal.l>ヘッダファイルは __BEGIN_DECLS void (*signal __P((int, void (*) __P((int))))) __P((int)); __END_DECLS #endif /* !_SYS_SIGNAL_H_ */ と書いてありました。 もちろんヘッダファイルにSIGPIPEとSIG_IGNは定義してあります。 これはOS側のsignalが古すぎてコンパイルできないのでしょうか? なんとか良い方法は無いでしょうか?
>>191 >OS BSD/OS 4.3
えらく懐かしいものをお使いで。特に自分で解決できる技量がない場合には、
より新しくて沢山の人が使っている環境を使った方が楽だよw で、
安直な方法: -Werror なしでコンパイルする
もう少しちゃんとした方法:
1) 本当に signal(SIGPIPE, SIG_IGN); の箇所か確認(試しにここをコメントアウトしてみる等)
2) 関数やその引数に最終的にどういう宣言が使われているか確認。プリプロセッサ処理
後のファイルをチェックしてみるとか。
(3) (2)の原因を理解して修正。インクルードやマクロ定義を修正したりとか。
>void *signal(sig,func());
manにこう書いてあるのはググってもそうひっかからないんだけど
http://mail-index.netbsd.org/netbsd-bugs/1996/03/24/0001.html というのがあるので、あるリリースのBSDにはそういうmanが付いてきたのかもね。
リチャードスティーブンスの本でわからない点があるので質問します unixネットワークプログラミングでifreq構造体ifr_dstaddrの説明でp-to-pリンクの反対側とありますが どういうことでどういう値が入るのでしょうか
ifconfigでPPPなどのpoint-to-pointなインターフェースを作ると、 対向側のIPアドレスが入る。
Xclockとか一見シンプルそうなアプリでさえ ソースコード見るとすんげえ量で萎える 人のコード見て勉強とかちょっと疲れてきた
Win32API ほどじゃない
wxPython オヌヌメ
xmessageって便利やな
201 :
デフォルトの名無しさん :2012/01/20(金) 19:51:48.27
今ubuntuのGCCコンパイラが4.5.2 が入っているんですが、 そのGCCコンパイラを4.4.5にダウングレードしたいのですが、どうすればいいですか?
パッケージのダウングレードなら犬板のUbuntuスレ、ソースからコンパイルならGCCスレで聞く方が良さ気
LinuxとかBSD系ってUNIXじゃなかったのな 昨日初めて知った ってことはLinux系の質問はここじゃスレチになるのか
1によるとUNIX cloneも含んでいるからおkよ
つうか清く正しいAT&Tの血統はまだ残っとるのか?
LinuxはUNIXじゃないがBSDはUNIXで良いと思ってた
BSDはUNIXの血を浄化しました。
BSDはトレードマークである「UNIX」は名乗れないです。 opengroupの認証通ってないので。
敢えてソースから何から全部書き直して ライセンス汚染してないことにしてる?
まだ初心者で申し訳ないのですが、 Ubuntu上でC++言語(g++)でマウス操作をやりたいと思い、 XAutomationのxteのソースを見て真似てみました。元はC言語でかかれています。 #include <X11/Xlib.h> #include <X11/extentions/XTest.h> としていて、そのヘッダではifdefでC++の場合は extern "C" が付きます。 なので自分の.cppでは特別なことをせずにXTestFakeMotionEvent(..)が呼べるはずなのですが、 リンカが"undefined reference to XTestFakeMotionEvent"とエラーを出します。 どうすればよいでしょうか?
-iXtst してる? gccのコマンドライン晒したほうがいいよ できれば最小限のソースも
あれ、l って打ったつもりが i になってる。ごめん -lXtst の誤り。詳しくは man xtestqueryextension で
Macの質問もここでおkなの?
Mac固有にならなければ
マックってユニックスだったんか 知らなかったわ
ということはiPhoneの質問もここでおkかな?
iOSはUnix系だとあるけど iPhoneでUnix的な使い方ってできたんだっけ?
mmapとか動くよ
>>221 「使い方」によるが、
カーネルとAPIの一部がBSDとコードベース同じだから。
224 :
デフォルトの名無しさん :2012/02/07(火) 20:55:21.88
おねがいします プロセス間通信で使う、名前付きFIFOをPスレッド間で使うことは可能でしょうか? それともなにか問題が発生するでしょうか? また、名前付きFIFOの名前を既存ファイルとかぶらないように自動生成する方法はありますか?
225 :
デフォルトの名無しさん :2012/02/07(火) 21:16:13.63
vimrcとかbashrcとかscreenrcのrcって何の略なんですか?
run commandの略だという説が有力
>>224 プロセス間で使えてスレッド間で使えなくなる理由が分からない
その内容だとpipeで十分に思える。というより、そういうライブラリ使ったほうがオーバーヘッドがないような
一時ファイルはmktempで作ると他と衝突しない
× mktemp
○ mkstemp
じゃなかったかな。
>>224 SIGPIPEのハンドリングが難しいのかな。
よくわかってないけどw
mkstempって普通ファイル以外作れたか?
231 :
デフォルトの名無しさん :2012/02/08(水) 07:55:45.41
>>228 >>229 >>230 用語を間違えていました。
名前付きFIFOではなく、名前付きパイプ(=FIFO)でしたね。失礼しました。
スレッド間だともしかして排他処理がうまくできないのではと思ったもので。
スレッド間で使うなら確かに匿名パイプのほうが適切ですね。
mktemp()のセキュア版であるmkstemp()は、ファイル自体を作ってしまうのですが、
普通のファイルをパイプ化できるのであれば問題ないのですが、
どうもそのようなことをしてくれるシステムコールは存在しないようで・・・
tmpnam()で名前だけ作ってmkfifo()でFIFOを生成してもいいのですが、
tmpnam()のせいでコンパイル時に恐ろしげな警告が出るのが気持ち悪くて・・・
・・・困りました
スレッド間ならファイルディスクリプタは共有しているので、名前付きである必要な理由は無いな。 あえてnamed pipeを選択する理由は?
名前付きを使いたいのはスレッド間ではないです
forkすればファイルディスクリプタは複製されるし、全く別のプロセスに ソケットを使ってファイルディスクリプタを送信することもできたはず というかその用途ならソケットで通信すればいいのでは?
> プロセス間通信で使う、名前付きFIFOをPスレッド間で使うことは可能でしょうか? > 名前付きを使いたいのはスレッド間ではないです どっちが本当?
下が本当です 上はうっかりミスで、 「プロセス間通信で使う、パイプをPスレッド間で使うことは可能でしょうか?」 が意図したQでした。 よって、想定しているシチュエーションは2つあったわけです。 1. スレッド間でパイプ使用 2. (プロセス間の)FIFOのユニークな名前の自動生成
できればプロセス間でも親子関係とか持たせてパイプにする方がいいような。 どうせユニークな名前をどうにかして相手に伝えないといけないんでしょ。
パイプでつなぎたい先のプロセスは、独立した実行ファイルによるものですので
forkしてパイプ準備してからexecすればいいのでは
寝ぼけてました・・・ 全く、そのような方法でやろうと自分でも考えていました。
書き込む前に一度読み直して人に伝わるかどうか位確認しろw
結局
>>240 の提示した方法で実現できそうな話だったんだな?
パイプの名前は?
SIGPIPEウゼエって時は、 int result = send( fd , buffer ,size , MSG_NOSIGNAL); ってやり方もある。OSとfiletypeを選ぶけども。
SIGPIPEなんて速攻でIGNOREしてたわ
解決した後で聞かれもしてない事(しかも大した情報量がない)を ドヤ顔で言い出す奴ってかなり恥ずかしい。
ためになるからイナフだ
250 :
デフォルトの名無しさん :2012/02/10(金) 20:19:25.23
system()がダメでexec*()じゃなければならない場合って具体的にどういう使いどころですかね?
・forkした後にあれしたりこれしたり ・login shellに左右されたくないコマンドライン
すいません・・・ そこをもう一声具体的に・・・悲
自分とパイプで繋がった子プロセス内で外部のプログラムを実行できたりとか
コマンドラインとして渡す文字列(の一部)が文字列としてプログラム外からやってくる時。
>>253 これは、なるほど!
実際試してみます
>>254 ___ ━┓ ___ ━┓
/ ― \ ┏┛/ ―\ ┏┛
/ (●) \ヽ ・. /ノ (●)\ ・
/ (⌒ (●) /. | (●) ⌒)\
/  ̄ヽ__) / | (__ノ ̄ |
/´ ___/ \ /
| \ \ _ノ
| | /´ `\
fork+execとsystemの違いってなんですか、ならわかるけど forkとsystemの違いってなんですか、だと根本的に勘違いしてるだろうからman読んだほうがいいよ
「シェルを通すか通さないか」という言葉ぐらいは知ってるんですが、 じゃあ、使い分けが必要なのは具体的にどういう箇所で?となると わかっている人に教わったほうが間違いがないかと思ったものですから・・・謝
言い訳だけしてまともに謝る事すらできないのか 人間のクズだな
ごめんなない
誠意を見せたかったらどうするのかわからないのか? 教えてやろう。画像を貼るんだよ。
systemとexecじゃできることが違いすぎて何を聞きたいのかが不明過ぎる
はったりはやめなよ
UNIX勉強しろよ
薀蓄自慢したい人ですかね?
267 :
デフォルトの名無しさん :2012/02/11(土) 11:43:52.95
>>263 別プロセスを生成させる以外になにか大きな使い方の差があるのでしょうか?
>>267 シェルがあるかないか も超重要じゃね?
>>267 ・systemは1)プロセスを生成して、2)別バイナリを実行する。
1と2の間にいろいろできる。(パイプでつなぐ、資格情報の制御、リソースの制限などなど)
・systemはshに実行させる。shの機能(リダイレクトとか)が使える反面、セキュリティ上の問題を起こしやすい。
やる気はあります! レスが付くまで全裸で待機していましたし
全裸待機する暇があったらman 3 system; man 3 exec
らめえぇぇぇぇぇぇぇ システムのページサイズを超えてかきこまないでぇぇぇぇ あたしまだバージョン 2.6.11 より前なのにぃぃぃぃぃ みたいな
Linux板でも逝け
あそこは管理系の薀蓄でブヒってるのが多いからなんとなくイヤ 「お前が管理しているそのツールのこの機能はどうやって作るのか」 という質問には答えてくれなそう
>>275 > 「お前が管理しているそのツールのこの機能はどうやって作るのか」
何言っているかよくわかりませんw
詳解UNIXプログラミング UNIXカーネルの設計 を読み終わったらまたいらっしゃい
そしてだれもいなくなった(未完)
嵐の番組ってCMが生理用品ばっかでワロス
>>277 >詳解UNIXプログラミング
棚から引っ張り出して眺めているが、内容が古くて実用に注意を要する
もっと新しいの同等品を教えろ
2/eが出てるよ
違いを意識したことないが、その手の本でPOSIX 2008に対応してるのってあるの?
>>284 表紙キモ!!!!!!
陰嚢の皺を無数の虱に這い回られているような気持ち悪さだ
旨そうなゼンマイだと思ったのにw
>>284 へーLinuxか。2008の機能も実装してたのか。この辺りの各OSごとの実装状況はまるで分からんが、
実装されているならマニュアルもあるだろうからそっちから調べるのもありだな。ありがとう
>実装されているならマニュアルもあるだろう (;゚ Д゚) …!? (つд⊂)ゴシゴシ
また半端な翻訳かまして、後が出ないよ糞詰まり状態に1000ペリカ
>>288 ポチってしまった俺は、訳本が出る前に完読してやろうと心に誓うのであった
出版元のサイトからPDFつきが70$で買えるけど(ディスカウントクーポン使用) もしAmazonでポチってたら強く生きてくれ
292 :
290 :2012/02/13(月) 21:39:17.18
なんじゃこの箱枕は!!!!! ('A`)
293 :
デフォルトの名無しさん :2012/02/14(火) 07:55:05.11
UNIXのインダイレクションについてレポートにまとめろとかいわれたんだけどUNIXとインダイレクションって なんか関係あったっけ?
リダイレクションの聞き間違いだろ。
>>293 せっかくだからそのままインダイレクションでレポート書いちゃえ
fork + execlpしたプログラムに引数でstruct構造体を渡すことってできますか?
馬鹿には無理
勉強しなおします
構造体の中身を全部文字列に直して、引数で渡して、その文字列から構造体を作り直せばいいよ
mmapした領域にコピーしとく、ファイルディスクリプタはそのまま 継承されるから、子プロセスでmmapすりゃいい。
301 :
デフォルトの名無しさん :2012/02/18(土) 21:05:03.13
テキストファイルを実行ファイルの一部としてくっつけておいて 実行時にそれを普通のファイルみたいにopen/read/writeすることは可能でしょうか?
実行するユーザがread, write権限もってりゃできる。 そういうユーザーは実行ファイルを壊すことも、悪質なプログラムに 中身をすり替える事も可能になる。
で、どうやって?
自分が入ってたファイルを書き込みモードでオープンできるかどうかは、 ファイルシステムに拠るんじゃないかな。 パーミッション的にOKだったとしても。
ファイルシステムじゃなくてOSに拠るのかも。 とりあえずbsd系では平気そうだけどlinuxでは無理だよね。
Solarisなんかも書き込みはアウト。 Text file is busyになる。 BSDもダメなはずだが… 一つの実行ファイルを配布して、それを実行しながら書き換えようってのは無理。 Mac OS Xならリソースフォークを書き換えればいいが。
>>306 BSDは手元にないからわからないけど、OS Xは書き込めるよ。
forkしたあとなら出来る?
textをbusyにしているプロセスが2つに増えるだけ。
BSDとかMachの仮想記憶だと、同じページをマップしてても書き換えたらコピーが作られるんじゃないの? だからOS Xは書き込める。
それはどのUNIXでも同じ。 ただし書き換えられるのはデータ領域。 実行ファイルが書き換えられるわけじゃない。 Mac OS X(Darwin)は同一ファイル内のリソースフォークを書き換える必要があるから、 HFS+のファイルはそう扱ってる。UFS(今はもうないが)上だと違う。
ああそうなんだ。OS Xでもファイルシステム依存なのね。
最終的に変更されたバイナリが残ればいいのなら、プログラム起動時にどこかにコピーを作ってそれで上書きすれば その上書きした方に対して自由に読み書きできると思うんだが、いろいろ怖い
314 :
デフォルトの名無しさん :2012/02/19(日) 04:22:57.33
315 :
314 :2012/02/19(日) 04:25:44.64
316 :
デフォルトの名無しさん :2012/02/19(日) 08:45:12.06
同じ問題で、画像データやアイコンデータなんかはどうやって管理しているの?
なにが?
>>316 パッケージ化して配布。
Macだってリモートファイルシステムではリソースフォークをうまく管理できないので、
buldleにして配布することが推奨されてる。
リードオンリーなら別の問題だ。実行ファイルに埋め込む場合もある。
実行ファイルに埋め込んだ場合、「どこにあるか」を知らないと読み出しできないではないか・・・ すんません、そういう関数や手順があるなら教えてください 一般的なLinuxでgcc|g++を想定しての話です
読むだけならデータ化すればいいだけだろ。xpmみたいに。
>>320 GNU ldなら
ld -r -b binary -o foo.o foo.jpg
でfoo.jpgをオブジェクトファイルにすることができる。
nm foo.oすりゃわかるが、_binary_foo_start、_binary_end_start
というシンボルが定義される。
このオブジェクトファイルを普通にリンクすれば直にアクセスできる。
リードする必要すらない。
おっと × _binary_foo_start、_binary_end_start ○ _binary_foo_start、_binary_foo_end
それをどうやって、(その画像データを読むプログラムの)実行ファイルにくっつけるの? まさか、異様に長い配列を?・・・・て、静的データを置く領域が足りなくて無理だし
別のファイルにしろ
いやだ!
>>324 ,328
データサイズ的には
>>321 と同じだぞ。
> 静的データを置く領域が足りなくて無理だし
なら、
>>322 も置けないという事にかわりはない。
>>322 そういえばMac OS Xのバイナリにはアイコン用のセグメントってのが定義されてる。
今は有効かどうかわからないが、大昔のNeXTの頃はそこにアプリのアイコン画像を
保存していた。
331 :
デフォルトの名無しさん :2012/02/20(月) 18:05:11.00
unixでdllのような動的ライブラリーはありますか? どうやって作ればいいですか
>>331 なんで「unix 動的ライブラリ」でググらないの?
組み込みとかだとサポートしてないアーキテクチャとかあるんかね。8bitMMUなしとか動くUnixが無いか
334 :
デフォルトの名無しさん :2012/02/20(月) 18:44:46.17
acfがあれば大体うごくよ
335 :
デフォルトの名無しさん :2012/02/20(月) 18:46:58.44
>>331 あるけど、OSによって作り方も使い方も違う。
LinuxとFreeBSDとSolarisの間でも微妙に違うし、MacOS Xとなるとかなり違う。
その辺の違いを埋めようってことでGNU libtoolというのが作られているけど、
こいつがまた色々とアレで、無意味で余計で有害なことをしてくれることがある。
FreeBSDでバージョン番号の付け方が致命的に間違っているとか。
結局、libtoolを使いこなすためにもOSごとの違いを一通り知っておく必要がある。
バージョン管理する気ないなら、軽微な差しかないと思っていい。
337 :
デフォルトの名無しさん :2012/02/20(月) 19:08:02.12
>>335 バージョン番号の付け方って?
libaaa.so.0.0.0
のような、最後に付加される0.0.0のことか?
これfirefox9.0.1などの数字とは根本的に意味が違うものなのだが、その辺はおわかり?
最近のFirefoxもバージョンの振り方間違ってると思うw
>>331 gcc -fPIC -c a.c
gcc -shared -Wl,-soname,liba.so -o liba.so a.o
Mac OS Xではこんなような感じで作った記憶がある。 cc -fno-common -c a.o cc -dynamiclib -flat_namespace -undefined suppress -o liba.1.0.0.dylib a.o
>338 あれはひどいな
343 :
デフォルトの名無しさん :2012/02/20(月) 21:50:08.25
ファイル hello.c #include <stdio.h> void hello(void) {printf("hello world\n");} ファイル hello.h #ifndef __HELLO_H__ #define __HELLO_H__ extern void hello(void); #endif //__HELLO_H__ ファイル main.c #include <stdio.h> #include <hello.h> main(){hello();} ソースコードが何をしてるかは一目瞭然なので説明はしない。 わからない人はさようなら。 これを通常のリンクでビルドする場合 gcc -o a main.c hello.c -I./
#include <hello.h> のいみがわかりません
345 :
343 :2012/02/20(月) 21:52:35.46
これの hello.c モジュールを動的ライブラリにする場合、 最も基本的な方法だと以下のようになる。 gcc -fPIC -c hello.c gcc -fPIC -shared -Wl,-soname,libhello.so -o libhello.so hello.o #インストール作業 install libhello.so /usr/lib/ install hello.h /usr/include/ 結果、/usr/lib/、/usr/include/にライブラリーとしてコピーされる。 しかしこれではまだライブラリーは有効にならない。ldへの登録の必要がある。 ldconfig これで libhello.so を使えるようになった。 あとは通常のライブラリをリンクする場合のやり方でビルドできる。 gcc -o a main.c -lhello
346 :
343 :2012/02/20(月) 21:53:39.53
libtoolを使って同様のことをする場合 libtool --mode=compile gcc -c hello.c libtool --mode=link gcc -o libhello.la hello.o -rpath /usr/lib #インストール作業 libtool --mode=install install libhello.la /usr/lib/libhello.la libtool --mode=install install hello.h /usr/include/hello.h ldconfig あとは普通にリンクできる。 gcc -o a main.c -lhello しかし、libtoolの有用な点は、この gcc -o a main.c -lhello も共通書式で書ける点にもある。 同じが、このようにも書ける。 libtoo --mode=compile gcc -o a main.c /usr/lib/libhello.la
347 :
343 :2012/02/20(月) 21:55:09.86
libtoo --mode=compile gcc -o a main.c /usr/lib/libhello.la これは何を意味するかというと、動的ライブラリーが使用できないOSの場合は、libtoolは静的ライブラリを生成する。libhello.a もしも libhello.aの場合は、gcc の書式は動的ライブラリの場合とは異なり、以下のようになるが、 静的ライブラリの場合: gcc -o a main.c /usr/lib/libhello.a 動的ライブラリの場合: gcc -o a main.c -lhello この書式の違いを、共通の書式で統一できるのが libtoolの利点である。 libtool --mode=compile gcc -o a main.c /usr/lib/libhello.la と書くことで、OSの対応状況に状況に応じて、都合良い方でビルドされる。(基本的には動的ライブラリの使用が優先される。優先度の変更はオプションで行える)
libtoolとかautotoolとか移植を簡単にするためのツールなのに、 そのツール自体の移植が非常に困難という矛盾。 考えた奴死ねばいいのに。
349 :
デフォルトの名無しさん :2012/02/21(火) 00:17:38.61
>>348 ?
なにを言ってるんだ?
よく考えてみろ
移植という作業の、面倒な部分のみを『抽出』して、そこを隠蔽するツールがlibtoolやautoconf。
つまり、アプリの多プラットフォーム対応の際の、面倒な部分のみを抽出した問題。この問題を解く作業こそが、libtoolやautomakeの移植作業というもの。
面倒な問題だけを一ヶ所にあつめて、問題を解こうとしてるのだから、困難なのは当然だろ。
逆に、抽出した困難さが、もしも簡単に解ける程度であれば(簡単にlibtoolを移植できたのであれば)、
それはもともと、切り分けるに値しないほど簡単な問題だったということになる。
なんで、システムライブラリ、ヘッダーをconfigureの度にスキャンするんだ? バカ丸出しのシステムだろ。 dllのリンクのために何行のツール作ってるんだ? リンクのために5行以上の記述が必要なシステムなんか見たことないぞ。
まあ色々なプラットフォームでのビルドをサポートするためのツールだし。 あとキャッシュを消さなければ毎回スキャンはしないかも。
>>350 autoconfはdllのリンクのためだけにあるツールじゃない。
まずツールが何するものなのか、結構簡単なんでそこを理解することから始めよう。
353 :
デフォルトの名無しさん :2012/02/21(火) 00:54:44.67
libtool は実質的に *.so (ウインドウズで言う所の *.dll のようなもの)をビルドする書式を共通化するためのものだけど、 ./configure を生成する autoconf, automake は、システムのタイプを判断する作業から、プログラマーを開放してくれるから、使った方が便利。 面倒くさいのでもう343のように詳しくは書かないが、(どうせ誰かが書いてくれるだろう。) 例えば、引数で受け取った画像を拡大縮小して、ファイル出力するツール|ライブラリを書く場合。 画像処理は(たとえば単純にバイリニアだとして)、 画像をブロック毎に分割して処理を行えば、完全に並列処理できる類の問題だよな?(アムダールの法則の1/(F-(1-F))のFが非常に小さい状態) だからスレッドに分割して、多コアに割り当てて、一気に高速計算するべき。 この際に、無駄なスレッドを作ると、逆に速度が遅くなる。 例えば、プロセッサのコア数が4だとしたら、スレッドも4個にするのが最も効率が良い。(コア数が4なのにスレッドを8個とか作っても、無駄だし、スイッチングロスで逆に遅くなる) このプロセッサー数を、実行時に判断することもできるのだが、それだとビルド時の決め打ちによる強力な最適化を書くことができない。 そこで、定数としてビルド時にコア数を知っとくことは、性能を追求する場合において、とても有用。 そこで、ビルド時にコア数を知りたいという要求が出てくるのだが、この「コア数を知る」という方法が、OSやCPUなどによって、それぞれ全然変わってくる。 これに全パターン対応するMakefileを書くのは、非常に負担となるので、ここを共通の書式で自動化してくれるのが autoconf の役割。 たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。 (AX_COUNT_CPUSのm4マクロによって(autoconf archive要インストール)) CPU数に限らず、ベクトル演算のサポートの有無など、事前に調べて最適化に有用な情報を、容易に得る手段として、autoconfは非常に便利なので使った方がいい。 autoconfで実行環境情報を積極的に得るようにすれば、プログラム最適化の幅が広がるはず。
thx!!
ちなみにCMakeはもっとスゴイぞ!
>>353 要するに、コア2のプロセッサをコア4のプロセッサへ換装しても、
それをautoconfが自動認識してくれるから便利ってこと?
バカなautotools checking ... これが世界中でどれだけ行われてるんだ? その電力で何人のアフリカの子供が… システムライブラリなんか一回スキャンしてデータベース作ればOK。 考えた奴死ね。
>>353 > たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。
autoconfが対応しているOS場合の事。対応していないときに変更箇所を探して、m4のマニュアル読みながらm4マクロ書いて…
Makefileに
NUM_CORE=4
5秒で終わるわ。
もうちょっとましな指摘は書けないのかよw
アフリカの子供が不幸なのはアフリカの大人がDQNだからだよ 日本で言えば、赤ん坊を車に放置してパチンコ台の前に陣取る親みたいなものだ
>>357 話はそんな簡単じゃないみたいだぞ。
例えばソフトをビルドするときにある関数が期待した振る舞い(フレーバー)で利用可能
かどうか、はシステムライブラリにそれがあるかだけでは決まらない(例えばコンパイラ
のオプション等)ので。
>>362 configureが検出したものをオプションと一緒に記録しておけばいいんじゃない?
コンパイルオプションで挙動が変わる関数くらい数えられる程度では?
若しくは、そういった特殊な挙動を要求するものだけはDBを使わないようにすればいい
configureごとに全く同じ処理をキャッシュできればそれだけで随分速くなる
オプションに利用可能性が依存するって、どの規格(c90, c99, ...)を使うかくらい。 その以外で振る舞いや有無が変わる関数なんて使ってられんわ。使う価値ないね。 もしあるなら、そんなクズな関数を捨てれば何人の餓えているアフリカの子供が…
過度の汎用性を求めて(といっても所詮Unix限定だけど)汚い設定ファイル地獄 便利さも体感できないって、なんだか一昔前のJava + J2SE + メタフレームワーク地獄 みたい m4とXMLの違いがあるけどね 今更m4なんて弄りたがるの変態ぐらいでしょ それはそうと、.laや.pcにフルパス埋め込まれるのは何で? あれrelocateしにくいから嫌なんだけど .aや.soにはそんなもん埋め込まれないのに
>>364 きみがパソコンすてればアフリカの・・・
さすがに古臭い感じはする。 こんだけ広まっちゃうと今さらどうこうするのは難しいだろうけど。
>>363 >>364 いや、コンパイラのオプションでかなり変わるっしょ。
そういうので苦労したことない?
簡単に思いつくのでも、マクロ定義でいろんな挙動が変わりうるし、
ヘッダーやライブラリをどういう順序/場所で検索するかが変わったり、
生成するコードやハードウェア依存の機能を使うかが違ったり。
で、コンパイラのオプションはソフト毎に違うし、オプション同士は独立でもないし、
グローバルなconfigのキャッシュをうまく管理するのは自明じゃないと思うのだが。
>>361 サムエル・ワンジルさんの事件の真相なんか見ると
まったく仰る通りとしか思えない
http://bl og.liv edo or.jp/dom esaka/archives/1337215.html
>>368 何を心配しているか分からないが、それを調べるためのツールがautoconfだろ?
例えそっちが言うように得られる結果が複雑になっても、それは調べた結果だ
難しく考え過ぎているようだけど、ようは
>>353 みたいに「CPUの数はいくつ?」という問いとその答えを
キャッシュしておけば速くなるって話で、全く同じオプションで挙動が変わることがないなら、そうした心配はないはずだ
>>368 規格に関するオプション以外であるなら実例だせば議論が進むぞ。
「ある」だけ連呼すんなよ。
それが人間が管理できる以上の組み合わせならautoconfは意味があるわけだし、
数個なら意味なしという事だ。
> いや、コンパイラのオプションでかなり変わるっしょ。 つまり、これの実例は挙げられないという事だね。 > 話が通じてないならいいよ。 捨て台詞がみっとも茄子。
いい加減にして
雲丹板って人減ってます?
>>337 -version-info CURRENT:REVISION:AGE
と指示したら、標準的なUNIX系環境では、
libfoo.so.CURRENT-AGE.AGE.REVISION
となるべきだよね。ところがlibtoolは、FreeBSD,NetBSD,HP-UXなどでは、
libfoo.so.CURRENT.AGE.REVISION
というバージョン番号を振ってしまう。
378 :
デフォルトの名無しさん :2012/02/24(金) 10:00:26.97
非同期シグナルセーフなprintf誰か作ってー
そういえば、memcpyは非同期シグナルセーフじゃ無いんだな
どなたか教えて頂けたらなと思います。 多分Linuxだけっぽいのですが、TCPでローカルホストにあるポートにconnect()するとして、 自分自身のソケットに接続できることに気づきました。 以下、pythonでですが、 from socket import * s = socket() s.bind(('', 5656)) s.connect(('localhost', 5656)) ↑connect出来てしまう。netstatでみるとESTABLISHEDが 1つだけあるような状況になります。 明示的にbindしてなくても、たまたま自分自身が開いた エフェメラルポートにも接続できちゃうみたいです。 感覚的には間違った動作に思えますが、そういう仕様なのでしょうか。
TCPの接続は<src IP, src port, dst IP, dst port>の四つ組で識別できる。 たまたま1と3、2と4が一緒でも特に支障はない。 プロトコル状態遷移の表の作り方によっては禁止もできるが。
お前ウソついてない? listenしてないのにconnectできちゃうの? pythonのsocketは知らんけど、勝手にlistenする? > from socket import * > s = socket() > s.bind(('', 5656)) > s.connect(('localhost', 5656))
>>382 >>380 がどういうことかはよくわかってないけれど、一般論として、
pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。
それからTCPの接続を確立するには、accept()しなくてもよくて、
両側からconnect()してもOKです。
どっちもよく間違う人がいるんだけれども。
>>383 > pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
> TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。
意味が分からないなあ。pythonでもCでもlisten()しなくてもconnect受け入れられると言っている?
それともpythonだけ? ↓を実行するとLinuxではリストにされず、FreeBSDではClosedなので、
とてもconnectできるとは思えないんだけど。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int s;
struct sockaddr_in sin =
{.sin_port = htons(5599)};
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
perror("socket"), exit(1);
if (bind(s, (struct sockaddr)&sin, sizeof(sin)) < 0)
perror("bind"), exit(1);
system("netstat -an");
}
カマー本とかスティーブンス本とか、 ソケットプログラミングFAQに詳しく書いてあるから読んでみてねん。
386 :
380 :2012/02/24(金) 20:19:31.29
>>381 >>383 >>385 ありがとうございます、勉強になります。
仕様上はありってところは驚きです。
スティーブンスの詳解TCP/IPとUNIXネットワークプログラミングならありますので、読み直してみます。
試しにバーチャルで2つLinuxマシン用意して、
お互いにconnectしあうようにしたら繋がってしまいました。
SYN_SENTを維持しなきゃダメみたいなんで、
RSTが届かないようにフィルタする必要がありましたけど。
ちなみにpythonじゃなくても同じですよ。
Cで書くとわかりづらいかな?と思ったのでpythonで書きました。
ってことは、LinuxでTCPを使うような時って、
エフェメラルポートを受信ポートに使うのって危険?
予期せず自分自身のソケットに接続してしまうかもしれない。
まあ、どっちかと言うと先にポートが使われてて開けられなかった、とかの方がありそうですけどね。
388 :
380 :2012/02/25(土) 03:39:23.24
>>383 >それからTCPの接続を確立するには、accept()しなくてもよくて、
>両側からconnect()してもOKです。
だんだん分ってきました。こんな感じですか?
・connectすると、SYNを送信して状態"SYN_SENT"
・相手から(あるいは自分の)SYNを受信して、状態"SYN_RECV"でACK送信
・ACKを受信して、状態"ESTABLISHED"
SYN_RECVなんて完全に忘れてました・・。
でもWindowsやSolaris10(x86)で同じ事は試しても、この通りにいきませんでした。
かならずしもRFCに従う必要がない?
>pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
>TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。
こっちはまだよく分りません。
LISTENになるのに別の手段が存在するということでしょうか?
390 :
380 :2012/02/26(日) 03:18:54.63
>>387 >>389 そうですね。ちょっと調べた後、そっちのスレで質問してみます。
皆さんありがとうございました。
単純なネタで恐縮ですが、errnoは並列化プログラミングに対して安全なのでしょうか? 主要な並列化手法の実装だけでもかまわないので、ご存知の方はコメントください。 また、チェック対象となるシステムコールやライブラリ関数の直前にいちいちerrno=0を 置くのはいまいちいけていない気がするのですが、もっとかっこいい方法はないですか?
1 スレッドライブラリが用意されている環境ならば、 #define errno (* __error()) のようにスレッド毎の変数になっているので安全。 2 システムコールやライブラリでエラーが発生したときに errnoが 更新させる仕様なので、コールする前にerrnoを クリアする必要はない。しかしerrnoを比較するとこでエ ラー判定をしてはいけない。システムコールならば戻り値 が負、ライブラリならばその仕様に従いエラー判定を行う。
>>391 > errno is thread-local; setting it in one thread does not affect its value in any other thread.
うちのLinuxのman errnoから引用。どこかで定められているはずだけど、どの規格か知らない
>>391 posix threadならTLSになってる
gccなら -pthreadとか
どもです(´・ω・`)
>>392 > スレッド毎の変数
スレッドローカルストレージという言い方が正確だと思います。
>>397 例示したマクロだといわゆるTLSなのか、全く別な方法なのか
わからないので、あのような表記にした。
おねがいします。 親子関係にないプロセス(PID既知)の生存を確認するための通常の手法はなんですか?
kill(pid, 0);
ありがとうございます! ・・・というか、一度はmanに目を通しているから、間違いなく読んでいるはずなのだが・・・ 恥をかかないと覚えないということか・・・
>>402 全部暗記できちゃうほうが異常者ですよ。
/procという手もある。(OSによっては)
>>403 全部暗記できるなら、その労力を他に向けるべきだな。
そして簡単に全部暗記する能力があるならば、manなど不要てことで。(ry
>>405 頭が弱いのか?
そのぐらい覚えられなくてどうする。余裕だろwwww
>>405 「どっかで見たなー」 っていう記憶がもっとも大事なんだよ。
「もっとも大事」はどうなんだろう?
教えてください
ftp://ftp.irisa.fr/pub/OpenBSD/src/sbin/init/init.c のプログラムなんですが、
どうやって/etc/rcを実行するのかがいまいちわかりません。
runcom関数内の
execv(_PATH_BSHELL, argv);
で実行しているのではないかなと思うんですが、
main関数内の、
while ((c = getopt(argc, argv, "sf")) != -1)
switch (c) {
case 's':
requested_transition = single_user;
break;
....
}
でrequested_transitionにsingle_userが代入される。
transition関数を経由して、single_user関数に入る。
までは、何となくわかるんですが、
single_user関数内でforkして、子プロセスで
argv[0] = name;
argv[1] = NULL;
setenv("PATH", _PATH_STDPATH, 1);
execv(shell, argv);
シェルを起動する。
そこからどうやって、runcom関数に入るのかわかりませんでした。
教えて頂けないでしょうか?
状態名の関数は全部最後に関数を返してるじゃん? それがカーネルが次に移る状態なのよ。 その状態で、実行すべき処理を記述してある関数を、 状態そのものの代わりにしている。 void transition(state_t s) { for (;;) s = (state_t) (*s)(); } だからこれが状態遷移マシンになるわけ。 requested_transitionは引数とか、シグナルとか、 上の関数を使った状態遷移からは逸脱するものを扱うためにある。
412 :
410 :2012/03/17(土) 06:18:23.32
すいません、もう少し質問させてください。 single_user関数内でforkして子プロセスで argv[0] = name; argv[1] = NULL; setenv("PATH", _PATH_STDPATH, 1); execv(shell, argv); 特に引数なしでシェルを起動していますよね。 んで、親プロセスの requested_transition = 0; do { if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1) collect_child(wpid); if (wpid == -1) { if (errno == EINTR) continue; warning("wait for single-user shell failed: %m; restarting"); return (state_func_t) single_user; } if (wpid == pid && WIFSTOPPED(status)) { warning("init: shell stopped, restarting¥n"); kill(pid, SIGCONT); wpid = -1; } } while (wpid != pid && !requested_transition); で、子プロセスの面倒を見る処理を行っていると思うんですが、この処理抜けないとruncom関数に入れないですよね? ただ起動させただけの子プロセスのシェルが、 if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1) collect_child(wpid); どうやってこの処理を抜けるんでしょうか?子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか? それとも、起動させた子プロセスのシェルが/etc/rcを実行するんでしょうか? その場合、/etc/rcの場所が分からないと思うんですけれど...
シングルユーザーシェルのプロセスIDがpidで、 do { } while (wpid != pid && !requested_transition); で、親プロセス(init)はシングルユーザーシェルの終了を待っている。 (シングルユーザーシェルはインタラクティブシェル) > 子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか? 親がシェルならsuspendして親シェルに戻るけど、親がシェルじゃないから、 シングルユーザーシェルからkill -STOP $$とかやったら固まるでしょ。 それを避けるためにリスタートする。
>>412 シングルユーザモードがなにか理解できてる?
>>413 シングルユーザモードの典型的なセッションは、
1. シングルユーザモード指定して起動
2. シングルユーザモードのシェルが動く。動いているサービスはほぼ皆無。
3. fsckしたり、パスワード変更したり、criticalなファイル直したり。
4. Ctrl-Dでシングルユーザモードのシェル終了。(exitコマンドでも)
5. マルチユーザーモードへ。(最近のUNIXは起動シーケンスが複雑で、再起動したいケースもままある)
416 :
410 :2012/03/18(日) 04:28:21.50
貴重なお時間頂いて、申し訳ないです。 /etc/rcって、マルチユーザーモードで起動するときに読まれますよね。 init.c内では、runcom関数でその処理を行っていますよね。 で、main関数内の while ((c = getopt(argc, argv, "sf")) != -1) switch (c) { を見て、 「initの引数は、sとfでf(FASTBOOT)は機能的に実装されていないようだし、 single_user関数内で、runcom関数に飛ぶのかなぁ」と思ったんですよね。 main->single_user->runcomの流れが勝手に(自動的に)行われるんじゃないかなと推測したんです。 でも、single_user関数を見ても子プロセスでシェルを起動させて、親プロセスは待つだけで、 人間が操作をしないと、次の処理に進むようには思えない。 do { } while (wpid != pid && !requested_transition); の処理ですね。 main->single_user(オペレーション終了待ち)->runcomになっているんですよね。 で、runcom関数はどうやって呼ばれるのかなと思ったんです。 質問が悪かったんです。すいません。質問すべきだったのは、 カーネル(bootローダー)からinitが呼ばれるときって、シングルユーザーモードでないときの オプションは'f'なんですか? です。
417 :
410 :2012/03/18(日) 05:35:51.09
すいません。 init_main.cを読んでちょっと理解できました。 flagsp = flags; *flagsp++ = '-'; options = 0; if (boothowto & RB_SINGLE) { *flagsp++ = 's'; options = 1; } #ifdef notyet if (boothowto & RB_FASTBOOT) { *flagsp++ = 'f'; options = 1; } #endif /* * Move out the flags (arg 1), if necessary. */ if (options != 0) { *flagsp++ = '¥0'; i = flagsp - flags; #ifdef DEBUG printf("init: copying out flags `%s' %d¥n", flags, i); #endif (void)copyout((caddr_t)flags, (caddr_t)(ucp -= i), i); arg1 = ucp; } つまり、何も指定しない場合は'-'が答えなんですね。
418 :
410 :2012/03/18(日) 05:47:21.65
>つまり、何も指定しない場合は'-'が答えなんですね。 すいません。何も指定しない場合は何もないが正解でした。 suwordなんて関数、初めて見ました。
たしかに「どっかで見たなー」は大事だけど そのうち「こんなのがあるはずだ」になって 無いものを探して時間を無駄にすることになる
man 9 store man 9 fetch man 9 copy
m9(^Д^)プギャー
>>419 30分探して見つからなかったら、「無い」よ
あったはずのものが見つからないと気持ち悪くて他の事が出来ない。 多分精神疾患なんだろう。
あったはずのものが見つからない・・・・ 夢・・・とか
>>424 あるはずの現実を見ようとしていない状態より遥かにマシだ
存在しないものをプログラミングするとか、 ゴーストを実装するようなもの。
まさにWizard
どどど同邸ちゃうわ・・・!
切迫していなければ 別に回り道したっていいと思うけど 最終的に正しい答えを導き出しているんだし そのぶん、ソースも読んだだろうし
>>427 つまり応答しないデーモンプログラムとか、
起動しているはずなのにプロセス一覧にでないとか?
無数にプロセスだけを起動しつづけるアプリとか?
ゴーストもいればゾンビもいる UNIX界はほんまホラーやで
>>431 伺かしか思い浮かばんかった
実装する気ないけど、フレームバッファが使えるOSなら仮想コンソールの背景に立たせることもできるのかな
仮想コンソールの窓越しにしか見えないスタンドのような存在か
みなし児もいる悲しい街なのですよ。
お前ら、非技術的な話題だと食いつき良いな。
技術的な話題も好物ですよ
物欲を満足しつつ、ちょっとしたUNIXプログラミングの実験&iPad用アプリの開発を こなせるマシンを購入検討したいのですが、現行機種で何かオススメはありますか?
Mac板で相談しなよ。
いや、UNIXプログラミングができるからこそのMac選択で、 似たようなことを考えた先達がいると思うからこそここでのQです ぶっちゃけ、Mac板でまともな回答が帰ってくるとは思えないし
441 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/02(月) 02:54:08.78
>>440 MacBook Airの一番安いのでスタバでドヤ顔しなさい
昨年、台湾の雑誌『遠見』が20歳以上の1000人にアンケートしたところ
「一番尊敬する国」「一番移住したい国」などの筆頭に日本が挙げられた
そうだ。
そういえば以前、台湾に旅行をした際に、現地で知り合った人に好意的に受け
入れられ、台湾は「親日」なんだと実感したことがある。
でも、どうして台湾は親日なのだろう。
産能短期大学講師で『日本に恋した台湾人』などの著書で知られる謝 雅梅さん
にお話を伺った。
「やはり歴史背景は大きいですね。日本統治時代(1895〜1945年)、
その目的はどうであれ、日本が台湾のインフラを整備したことは今でも高く
評価されてます。72歳になる私の父は、小学校4年生まで日本の教育を受け
ましたが、不思議と日本人に立ち居振る舞いも似てくるんですね。いわゆる
日本の頑固親父と一緒(笑)」
では、65年生まれの謝さんや若い世代にも親日派が多いのはなぜ?
「私の世代の場合、反日教育も受けましたが、父の世代からいい印象も聞いて
います。日本のテレビ番組や雑誌なども昔からあって、よく見てました。今、
20代くらいの若者には、日本の音楽やファッション、マンガやゲームなどの
サブカルチャーが人気です。彼らの世代になると、もう日本との歴史をよく
知らないんですよ。台湾も、日本のようにアメリカの影響は大きいんですが、
やはり同じアジアの日本文化の方が肌に合う。これは一過性の流行ではなく、
親日感情は昔から繋がっているんです」(同)
http://headlines.yahoo.co.jp/hl?a=20070802-00000002-rec_r-int
ライブラリーを利用せずにカーネルを直接呼び出すアプリを作りたいんですが 参考にするにはどんな検索ワードで探せばいいでしょうか?
linux システムコール アセンブラ
>>445 カーネルによって違うんだからこの情報では不親切では。
それにあえてマイナーなのを紹介しなくても。
>>446 PDP-11とx86が基本的に変わらないというのですね、わかりま... せん。
strftimeのフォーマットに則ってるかどうかを 格好よく調べる方法ない?
>>443 システムコールの実装
in Linuxカーネルインターナル
XLIBに出てくるATOMって何ですか?
COMのアウトプロセスサーバーみたいに プロセス間で一つのオブジェクトを共有し、 一方のプロセスからもう一方のプロセスを制御する方法はありますか? 単に値を共有するだけならpipeやmmapを 使えばいいんでしょうが面倒です。
socketとかsignalで通信するのは駄目なの?
mmapすら面倒ならマルチスレッドで作るとか
sigactionについての質問です。 古いソースではsigvecを使っていて、ちゃんとそれが動いているんだけど 私が使っているsignal.hヘッダの中にはsigvecが定義されていません。 どうして動くんでしょうか
obsoleteだから、特に指定しないとcompileは出来ないけど、linkは出来るようになっているんでしょう。
>>452 >>453 >>455 アウトプロセスサーバーみたいに、直接(擬似的)他プロセスの
メンバー関数呼んで、ポインターやら値を渡すってのは無理そうですね。
シェアードメモリ?
分散オブジェクト?
単にExcelの制御みたいな感じで、プロセスとか接続気にせず操作したいだけです
>>462 ローカルプロシージャコールができて、引数からオブジェクトを渡せればいいので
そこまでは求めてないです。
こんばんは。 DJBのqmailとかdaemontoolsのソースを見てて疑問に思いました。 DJBの str_*** のような文字列に対する関数って for(;;)の中で1文字ごとの処理を連続4回書いてあるのですが、 これって何かメリットがあるのでしょうか? この人の書くことだから、何か意味はありそうに思えるのだけども。 /* 例えばDJBのstr_len.c */ unsigned int str_len(const char *s) { const char *t; t = s; for (;;) { if (!*t) return t - s; ++t; if (!*t) return t - s; ++t; if (!*t) return t - s; ++t; if (!*t) return t - s; ++t; } } ↓↓↓これでいいように思える↓↓↓ unsigned int str_len(const char *s) { const char *t; t = s; for (;;) { if (!*t) return t - s; ++t; } }
つ loop unrolling
466 :
464 :2012/05/02(水) 12:10:30.82
>>465 loop unrollingっての知らなかったです。
ひとつ賢くなりました!
Wikipedia: “毎回の繰り返しごとに発生する「ループの終了」条件のテストを
減少させる(もしくはなくす)事によって、実行速度を向上させる”
・・ですね。
でも、「ループの終了」条件のテストをforにいれず、
結局1行ごとに4行毎回判定してるので、なんとなく関係ないような気が・・
あと一応、測定してみましたが、4行に分けるより、
1行にまとめたほうがわずかばかり速そうです。
※VMware上 Linux x86_64 gcc4.4.6 -O3 で、100000000回ループを30回測定
(なんでそういう結果が出たかは調べていません)
それとも、やっぱり状況によっては 4行書いたほうが最適化とかかかって
速くなったりするものなのでしょうか。
ていうか、djbのスタイルを参考にするのはやめれ。 根性で標準ライブラリを使わん、とか、癖があり過ぎる。
>>466 速度に関する最適化は、普通にコーディングした後に、どうしても速度的な要件を満たせてないときに
限って、ボトルネックがどこか「実際に測定して場所を特定」してから行うもの。
数nsレベルの調整なんかしなくていい。
469 :
464 :2012/05/02(水) 16:43:21.92
もちろんスタイルをまねする気も、速度を気にしてるわけではないですよ。 普通の人から見たら、ただの縛りプレイにしかみえないですし。 ただ、偏執狂なんていわれるほどの人だから、 この意味無いように見えるコードも何かあるのかな、と。 daemontoolsはよく使いますので、 コードも見てみようと思ったのが発端です。
本当に意味わかんないなこれ。 4bytes コピーして最適化したつもりが気が変わって無理矢理戻したとか、いや違うな。 素直に strlen() 使った方が最適化してくれていいのになあ。
どうせ最適化がかかるだろうし無駄な書き方ならライセンスで面倒なことが起きないとか?
いずれにしろ、その部分が、全体の90%の時間を食ってる、10%のコードだ、 ということがわかってからでいいことだな。
474 :
464 :2012/05/02(水) 21:40:41.21
結局なにがしたいんだか分からないなー。
>>472 >まずlong intのサイズ毎にビット演算して0バイトがないか調べて(ちょっとトリッキー)、
>もしあったら詳細に調べるみたいな感じのことをしてる。
>インテルならXMMレジスタ(16バイト)を使うとさらに効果的。
https://gist.github.com/77178 glibcのstrlen、すごいことしてるんですね。
特にビット演算のマジックナンバーが全然意味分かりませんでしたが、
説明をググったら解説があって、なんとなく分かったような気にはなりました。
なんすか、よく思いつくなと。
もう一個のアセンブラのほうは、
ニーモニックが全然分かってないので辛くて読んでませんが、
とにかく、案外、工夫のしがいがあるものなんですね。
非分岐時のみ投機実行のあるRISC系のCPUなら4行展開して意味ありそう。 けどCPUのアーキテクチャにベタベタに依存するコードだし、 遅延スロット埋める投機実行はもっと高度になってるから活躍の場は殆ど無いだろうね。
シェルスクリプトの質問なんですが、 いちいち別のサーバにログインしたりするのがめんどいので、 一つのシェルスクリプトで、 ローカルマシンとリモートマシンの実行結果を マージしたりする仕組みって無いんですかね? #!/bin/sh num1=$HOME num2=@$HOME<-例えば@の後ろに何か処理を書くとその処理は設定されたリモートで実行される echo $num1<-ローカルの$HOME echo $num2<-リモートの$HOME
man rsh man ssh
Linuxで、ライブラリとかにデバッグ用のシンボルが付いてるかどうかって どうやったら調べられましたっけ。
fileコマンドでstrippedと出るか出ないか、かな?
nm -a
ncursesのC++実装について分かる方教えてください
482 :
481 :2012/06/30(土) 08:23:23.34
自己解決しました
マルチバイト文字を出力する方法がわかったのですが、 複雑なので他の方の参考になるように ここに書いておきます /* cc -o test test.c -lcursesw */ #define _XOPEN_SOURCE_EXTENDED #include <curses.h> #include <wchar.h> #include <locale.h> int main() { cchar_t ch; wchar_t wc[2] = L"あ"; setlocale(LC_ALL, ""); initscr(); setcchar(&ch, wc, 0, 0, NULL); add_wch(&ch); getch(); endwin(); return 0; }
>>483 これじゃ駄目なの?
$ cat test.c
#include <stdio.h>
int main() {
puts("あ");
return 0;
}
$ gcc -o test test.c
$ ./test
あ
>>485 cursesでマルチバイト文字をどう扱うかって話だよ
素直にncurcesw使えばいいんでないかと思う
>>484 UNIX界隈にもアセンブリをアセンブラ呼ばわりする人が居るんだな
アセンブリ言語
490 :
デフォルトの名無しさん :2012/07/28(土) 08:38:10.33
教えてください 静的ライブラリと、LD_PRELOADで指定された共有ライブラリでは、 静的ライブラリのほうが必ず先にロードされる、で正しいでしょうか?
静的ライブラリは、実行形式ファイルの生成時にロードされ、リンクされる。 共有ライブラリは、実行形式ファイルの実行時にロードされ、リンクされる。 ということで、タイミングとしては静的ライブラリの方が時間的に早いので その意味では正しいと思われます。
LD_PRELOADで指定されてる方がタイミング的には先だな
くだらないこと気にしてないで重複しない命名規則をだな、
デバッグ時に使いたいって話だよ
pidの分からない複数の子プロセスにシグナルを送る方法はありますか?
>>497 kill()関数でpidにゼロや負数を入れるといいらしい
500 :
デフォルトの名無しさん :2012/09/17(月) 22:19:03.43
このプログラムを書いた人に訊きなさい
502 :
デフォルトの名無しさん :2012/09/17(月) 23:28:29.51
馬鹿には聞いてません
503 :
デフォルトの名無しさん :2012/09/18(火) 01:14:44.29
>>501 すみません、現在その人と連絡がとれなくて、困っています
504 :
デフォルトの名無しさん :2012/09/18(火) 01:23:00.19
>>500 文字化けしてますかね??
for (y=0; y<h; y++){
for (x=0; x<w; x++){
i = y*w +x;
k = init[i];
while ( identical[k] != 0 ){
ここの間
identical[k] = 0; // ダミー
}
final[i] = k;
printf("%3d", final[i]);
}
printf("\n");
}
のとこです
豚切りすいません。 超初心者です.... touchでファイル作ろうとしたらpermission denied ってなるんで chmodでパーミッション変更しようとしてもどうやら元々の奴の権利を変えるだけのモノ? みたいで、作成できるように権限を変えたいのですが、 どなたか教えてもらえるとありがだいです。
ディレクトリにchmod あと.hogercの確認
馬鹿には無理
505です。 レスありがとうございます。 あれから chmod 777を打ったんですが Unable to change file mode on と出てきてしまいました。
509 :
505 :2012/09/21(金) 22:01:57.26
何度もすいません。
ごめんなさいm(_ _)m
ディレクトリの権限がrootだったのでユーザーから作るのはやめて、
rootでファイルを作りました。
そのファイルというのは~.phpでして、それで
http://localhost/~.phpをクリックしても 白紙でした。
どうすればPHPの情報が表示されるようになるのでしょうか⁇
プログラミング以前に、操作がままならないんだから、 UNIX板orLinux板の初心者スレに行け。
511 :
デフォルトの名無しさん :2012/10/08(月) 16:57:39.28
オープンソースなLinuxって何でもかんでも無料で大丈夫なんだろうか
だからGNUやFSFが共産主義的思想に基いているという噂が広まるんだよ
板違いってことさえわからない頭で考えても無駄。
>512 それは噂じゃなくて事実www
ディレクトリストリームに関する質問です。 open関数にディレクトリのパスを入れると、ディレクトリストリームという ものがオープンされると参考書に書かれています。 これは、open関数が"ハードディスク上"のディレクトリの中身の ディレクトリやファイルの情報を"メモリ上"のstruct dirent構造体に マップしていっていると考えていいのでしょうか? あとreaddir関数に関する質問なのですが、この関数の引数のstruct dirent 型のポインタはreaddir関数で+1してから、このポインタに上書き(?)されて ますか?それとも初めに引き渡されたポインタを保持してますか? まだ勉強中なので的確な言葉選びができてなくて回りくどい言い回しに なってそうですが教えてください。
>>516 すみません間違えました。
open関数じゃなくてopendir関数でした。。。
この辺の認識が正しいかどうかはヘッダファイル見ていけば
わかるんですかね?
ヘッダファイルなんて現時点のスキルで読み始めたら時間かかって
しょうがねえだろうなあと思ってるんですが。
>>515 "opendir source code"でググって、ソース読め
>>518 ,519
キーワードあざっーす!
この辺に入っていかないとダメなんですね。
ずぶずぶやないかぁ・・・
勉強中なら、ストリームという概念がわかったところで次に行った方が良いんじゃないかと思うけど まぁ人それぞれだよね。
scp 転送元ディレクトリ/*.* ./test を実行したときカレントにtestというディレクトリが無いと testというファイル名でファイルができてしまいます。 testディレクトリがなかったらエラーになるようにしたいのですが どうしたらいいでしょうか?
scp 転送元ディレクトリ/*.* ./test/
525 :
522 :2012/10/11(木) 18:46:55.30
>>524 おお、できました。そういうのがしたかったです。
ありがとうございました。
openした際にメモリ上にマップされるFILE構造体のメンバに ファイルディスクリプタがあると思うのですが、 同じファイルをopenするプロセスが複数あるとき、 それぞれのプロセス内のFILE構造体のメンバである ファイルディスクリプタは異なる値で、実データへのポインタ (inodeと対になっているメタデータ)は共有という理解で合ってますか?
ファイルディスクリプタは、プロセスごとに定義されているので、 偶然同じ値であることがあります。 stdin, stdout, stderr以外にファイルはオープンしてない場合、 次にfopenしたファイルのファイルディスクリプタは3です。 要するにファイルディスクリプタは全プロセスにまたがった固有のIDと見做せません。
>>527 ありがとうございます。
ようやくマルチタスクなる物が何なのかわかってきました。
530 :
デフォルトの名無しさん :2012/10/21(日) 04:02:48.75
プログラムを走らせると、topで見るとsystem CPUの値が異常に高いのですが、 systemってどんなことをした場合に消費されるのでしょうか?
ソウルからヨボセヨ 「ハングル輸出」は虚報 2012.10.20 03:01 [韓国]
韓国独自の文字であるハングルは民族的自慢のタネで、10月9日が「ハングルの日」として以前は祭日だった。
しかし祭日が多すぎると休日からははずされたため、復活を望む声が強い。
来年には復活の可能性があるとかで、カレンダー業者が気をもんでいる。
そのハングルをめぐってまずい話が起き問題になっている。
先年、インドネシアの小さな島の部族がハングルを自分たちの「公式文字」に採択したというニュースがあり
「ハングルの優秀性を世界に示した」として官民挙げて大喜びした。
教科書でも紹介されるまでになったのだが、最近、この話はマスコミが誇張したもので「公式文字採択」は虚報と分かった。
政府も教科書や各種展示を手直しすることになったという。
この少数部族というのはスラウェシ島に近いブトン島のチアチア族といい人口は6、7万人とか。
固有の部族語を話しているが、韓国の団体が援助を餌にその部族語の表記にハングルを使うことを勧めた。
その結果「公式文字に採択」となったというのだがインドネシアはローマ字が公用文字。地方の部族が別の文字を
公式文字に採択するのはありえない。
実際は単にハングルを学んでいるといった程度だったのだ。ハングル愛国主義の勇み足である。(黒田勝弘)
http://sankei.jp.msn.com/world/news/121020/kor12102003020000-n1.htm
>>530 システムモードのCPU使用率が高いということは、つまりカーネルで動作していた時間が
多かったことを意味する。
例えば、ファイルのopen, closeを繰り返してファイルシステムやデバイスドライバばかり
動しているとか
>>532 >例えば、ファイルのopen, closeを繰り返してファイルシステムやデバイスドライバばかり
>動しているとか
この理由付けはどうなんだ
>>530 メモリ足んなくて、メモリスワップしてるような状況でもsystemが上がりがちですかね。
思いつくのを適当に列挙すると ・ユーザーランドから無駄にシステムコール発行してる ・ドライバが腐ってる ・ハードが壊れてる ・アタックされてる かねえ
537 :
デフォルトの名無しさん :2012/11/17(土) 19:30:00.85
教えてください /proc以下の仮想ファイルと同様の仕組みを、自作アプリケーションの内部変数を 外から確認するのに使いたいのですが、それ用のAPIはありますか? また、ターゲットに考えているアプリはパフォーマンスが非常に重要なのですが、 各種の高速ソフトウェアを動作させることが可能なOS自身が/proc以下を提供しているのだから、 そのような仕組みは処理のボトルネックにはならないだろうと期待しているのですが、どうですか?
text I/Oだから普通にボトルネックになりうる。 mmapを使ってください。
system()で生成した別プロセスに対してシグナルを送信する場合、典型的にはどれくらいの時間がかかりますか? (人間の感覚では一瞬ですが、たとえ一瞬でも実際は有限の時間がかかりますよね?) また、シグナルと同様にプロセス間で非同期の通知をするための高速な方法は他にありますか?
シグナルはそんなに速くないよ。 特にシグナルハンドラー使う場合。 ハンドラはカーネル空間でなくてユーザ空間で実行しないといけないから。 システムコールにブロックされる可能性あるから、 シグナル割り込み可能性や再入可能性で調べてみて。 セマフォアやpthread_mutex(ただしプロセス間拡張あるUNIXで)使った方がいいよ。
>>541 そうなんですか・・・(´・ω・`)
msec以下での応答は難しいですかね・・・・・?
使うシステムコールやマルチスレッドかどうかによる。 ちなみにmsecレベルの応答性なら 高速性は必要とされてない応用にカテゴライズされると思う。
>>540 蒔きに火をつける時間と、のろしをあげる時間が必要
>>543 そうなんですか・・・喜
あ、スレッド間じゃなくプロセス間で
>>544 送信側でもたつくという意味ですかね?
マルチスレッドかどうかは、 中断可能じゃないシステムコールを呼んでいる時に シグナル受けて処理に時間がかかるかどうかに関わってくる。 マルチスレッドなら、シグナル受けるの専用のスレッド置いておけば良い。
>>546 勘違いしていました
よく分かりました・・・・謝
>>544 ONした後は光速で伝わるから
馬脚よりは高速なんですね
わかります
549 :
デフォルトの名無しさん :2012/11/18(日) 14:04:51.05
Intel Xeon Phiを扱えるコンパイラーを教えてちょ
gcc
素直にicc使えば?
>>541 共有メモリにフラグ用意して、RTプライオリティにしたプロセス間で
ポーリングかけるのが時間安定性的に一番確実な気がしないでもない
CPU食いまくるが
553 :
デフォルトの名無しさん :2012/12/07(金) 18:16:20.75
初心者なので間違っているかもしれませんが、 おそらくデータリンク層に関する質問です。 例えばプログラムでIPプロトコルを使って、 LAN内のサーバにデータを送るということをしようとする場合、 プログラムではIPヘッダに対応するstruct sockaddr構造体のメンバに 情報を与えるということしか行っていないと思うのですが、 Ethernetヘッダはプログラムを書いてコンパイラを通すと、 送信処理を行う時は NICを通してEEPROMからMACアドレスを読み込んで それを送信バッファに 書き込むという処理がアセンブラコードに 書かれていると考えていいのでしょうか?
554 :
デフォルトの名無しさん :2012/12/07(金) 18:23:54.52
なんでやねん。
初心者とは謙虚な
>>553 そう考えては駄目です。そうなっていませんから。
>>558 UNIXプログラミングスレでの質問なのでUNIXでどうなっているかというと、
L3(IPパケット)ヘッダやL2(Ethernetパケット)ヘッダを作るのはOSカーネル内の
プロトコルスタックと呼ばれているモジュールが行う。
組み込みなどでキミが想像しているようなライブラリでの実装もあるかもしれない。
お、おれに言われても…
>>558 もう一回言うからよく聴け。
それはカーネルの仕事でユーザプログラムの仕事じゃない。
562 :
デフォルトの名無しさん :2012/12/08(土) 07:25:35.96
>>557 さすがエスパー様
仰る通り組み込みを想定しておりまして、
ハードウェアから勉強するしかねえなーと思いながらちょこちょこ
勉強しだしているのですが、なにぶんノーマルの処理を知らないのです。
プロトコルスタック勉強してみます。ありがとうございます。
>>560 ひとつひとつ論理的な積み重ねで物ができるとおもしろいです。
>>561 折を見て聞いてみます。とりあえずプロトコルスタックなるものを
勉強してみます。誘導ありがとうございます。
プロトコルスタックを自前で書いてたら一生かかっても終わらねえよ。
echo aaa > test.txt のようなテキストファイルに文章を追記するコマンドの使い方がありますが 半角スペース入り半角記号入り改行入り半角英数字文字列をテキストファイルに追記もしくは新たにテキストファイルを作成する コマンドはありますか?バッチファイルを作成したいのでviでテキストエディタを起動して作成等の方法は使えません。
echo " aaa aaa " > test.txt とかでどう
>>564 「bash ヒアドキュメント」でググれ
Subversionをインストールしたマシンにコミットしたファイルの ディレクトリってデフォルトだとどこにあるかわかりますか?
ヒアドキュメントってこういうやつね。 cat <<_END_ >test.txt aaa a a _END_
Linux で、Objective-C 使えますか?
ハードリンクと違って、 シンボリックリンクはそれ自体がリンク情報を格納したファイルだとの事ですが リンク情報ファイルとして直接見る(テキスト/バイナリエディタ)にはどのようにすればよいでしょうか?
>>573 どのファイルシステムの話をしてんだよ。
環境は MacOS10.7 ファイルシステムは HFS+ ですが ファイルシステムによって開き方が違うんですか?
わかればよろしい
579 :
デフォルトの名無しさん :2014/03/04(火) 10:40:27.75
あらら随分と寂れちゃって やっぱUNIX系でプログラムミングしようなんてヴァカは少ないんだろうな
馬鹿には無理
「やっぱUNIX系でプログラムミングしようなんてヴァカ」という奴はいない
583 :
デフォルトの名無しさん :2014/03/05(水) 00:05:19.95
584 :
デフォルトの名無しさん :2014/03/05(水) 03:25:53.72
わかればよろしい
585 :
デフォルトの名無しさん :2014/03/07(金) 22:08:54.91
ユニックスでプログラミングとか真性のオタクだろw
586 :
デフォルトの名無しさん :2014/03/08(土) 13:19:20.76
まあプログラミング作業そのものはwin 上でおこなうけどな
プログラミングする奴はゴロゴロいるけどプログラムミングはそうそういないな
プログラムミングだからか、そりゃMinGWでやってりゃいらつくかもしれん
590 :
デフォルトの名無しさん :2014/03/12(水) 19:32:04.52 ID:cq0Wuml2
Program MinG
591 :
デフォルトの名無しさん :2014/04/04(金) 11:37:49.40 ID:+1zjSCgd
私は主にLinux上で、C/C++のプログラミングをするんですが、 Linux の システムコールや標準ライブラリ関数が、 スレッドセーフかどうかが公式マニュアル等には、 まず記述されていないことが多いです。 スレッドセーフでない関数をスレッドから使うと おかしな動きになるんですが、 スレッドセーフかどうかがハッキリ記述されている例の方が 少ないです。 みなさんはどうしてますか?
man pthreads
システムコールはされてるだろ。glibcも。
594 :
デフォルトの名無しさん :2014/04/08(火) 18:36:01.77 ID:nqRQMd5J
質問です。 ネットワークAPIの略号はこんな感じでいいのでしょうか? a : ascii h : host hs : host short hl : host long n : network or numeric ns : network short nl : network long p : presentation (.で区切られたアドレスを文字列で表現) aとpは同じ意味なのでしょうか? nはnetworkと説明されていたり、numericと説明されているのですが、 どちらでもいいのでしょうか? よろしくお願いいたいします。
???
>>594 まじれすすると
しいて言えばaがaddress、nがnetworkじゃ?
inet_addrとinet_networkがあるしな。
aがasciiじゃ使える文字の種類が多すぎだろw
aとpは、とりあえず関数の対応範囲が違う。
しかし、これがUNIX固有の話だと思ってここに書き込んだとしたらそれは間違いw
597 :
デフォルトの名無しさん :2014/04/08(火) 19:37:10.16 ID:kcd9laA9
>>596 一部の英語ページでasciiだと書かれている所があったのでasciiだと思いました。
>aとpは、とりあえず関数の対応範囲が違う。
kwsk
>しかし、これがUNIX固有の話だと思ってここに書き込んだとしたらそれは間違いw
と言ってもUNIX発祥ですよね?
>>597 >と言ってもUNIX発祥ですよね?
まあBSDソケットのことを指すなら...
しかしじゃあC言語の話もUNIXなのか? ウェブの質問をする場合はNeXTか?
>>579 会社を探しても見つからないのでPHPを覚えることにした
>>598 横だけど
>しかしじゃあC言語の話もUNIXなのか? ウェブの質問をする場合はNeXTか?
前半はカニチャーハン読むとその感じがわかるが、後半は???
わからないなら黙ってろよ
適当なこと書くなよ
webはNeXTSTEP上で開発されたからでしょ。
ソースは?
ブラウザーか
サーバもそうだね、ごめん
>>600 カニチャーハンに吹いた。
>>598 世に転がってるコードのほとんどがBSDソケット関連だからしょうがあるまいよ
aはBSD socket こっちがオリジナル
pはPOSIX
POSIXがpに変えた理由は分からん。atoi何かと共通でいいのにな。
>>609 NeXTSTEPで開発したと言っても、BSDシステムとして使ってるだけ。
ところどころNeXT亜種としてのifdefがある程度。
waitかwait3かwaitpidかとか。
>>610 サーバ側はそうかもしれないけど、
クライアント側もNextStepフレームワークの機能をほぼ使ってなかったの?
613 :
デフォルトの名無しさん :2014/04/09(水) 15:46:27.04 ID:i8e/a0RW
>>610 POSIXで追加した関数がpになった?
POSIXでもaは残っているよね?
>ウェブの質問をする場合はNeXTか? ウェブといえばブラウザーの話な、これまめな
つまらないボケのつもりなのか何なのか。
つかタダでさえ人減ってるのにいがみ合ってどうすんだよ
>>612 使ってたよ。今のiOSのCocoa Touchにあたるものが既にあったからね。
当時大学でNeXTが使えたので一応リアルタイムで遊んだ。
しかし「所詮ハイパーテキストだろ」、と思った俺に先見の明はまるでなかった。
Gopherでエロ画像を配布・収集することに精を出していたのはいい思い出
その後NeXTからWebObjectが発表されて、ただの静的なハイパーテキストから
動的なWebアプリの概念が発展していった、と理解している。
Mosaicからしか知らん tp://ftp.ncsa.uiuc.edu/Mosaic/
そういやarchieを最後に使ったのがいつだったか思い出せないや
どこまでタイムスリップしたらwwwの創始者になれるかな。
www
625 :
デフォルトの名無しさん :2014/04/11(金) 09:27:55.52 ID:I+yNGwZi
>>623 マジレスすると
そういう夢見るのも良いけど
20年後の世界標準(ω)になるものを
今から創造した方が楽しいぞ
>>625 マジレスすると別に興味ない。
自分の開発環境が快適と思えればそれでいい。
627 :
デフォルトの名無しさん :2014/04/11(金) 11:53:48.19 ID:nfBS813s
今どき、サーバプログラムを作るときはどうするのがいいのかな 規模が小さいからxinetdで済ませたいんだけどそれでもいいんだろうか
628 :
デフォルトの名無しさん :2014/04/11(金) 13:01:29.58 ID:31jcxzSz
>>627 デーモンにするか、xinetd にするかは、
クライアント側からのアクセス頻度で決めるべき問題でしょ。
アクセス頻度が十分に多ければデーモンにすべきだし、
少なければ xinetd, inetd の方がいい。
一般的に使われるものならinetdがないMac OS Xの事も考えてやってね。 代わりにlaunchdというのがある。
630 :
デフォルトの名無しさん :2014/04/12(土) 11:46:22.55 ID:0X1ZzDgt
ありがとう inetd系でいくわ
ひろゆきの宣伝うぜー。 10年前にあめぞうを荒らして2chに誘導したのと全く同じことをまたやろうとしてやがる。 全く変わらずクズだな、ひろゆき。
なるほどね また鯖おちたね
634 :
デフォルトの名無しさん :2014/04/30(水) 14:41:44.67 ID:XBNt2TTL
----foo.sh---- #!/bin/sh if [ bool処理 ];then exit 0 else exit 1 fi ----foo.c---- return = system("foo.sh"); if(WEXITSTATUS(return)){ シェルスクリプトでexit 0の時の処理 }else{ シェルスクリプトでexit 1の時の処理 } このようにシェルスクリプトの終了ステータスで条件分岐したいのですが いつもtrueになってしまいます。 どのようにすればいいでしょうか? よろしくお願いします。 % uname FreeBSD
returnは予約語 WEXITSTATUSが非ゼロの場合のコメントが「exit 0の時」 実際に問題となったコードで出し直し
636 :
デフォルトの名無しさん :2014/04/30(水) 15:55:27.10 ID:23BUNUOn
t
馬鹿には無理
639 :
デフォルトの名無しさん :2014/05/06(火) 12:51:39.88 ID:OFsDJUcu
Cで、標準入力と標準出力をひとつにして標準入出力としたい。
すれば
>>640 そうしたいのはやまやまだが
やり方がわからぬ
unix ではプロセス間に生成されるパイプは基本リードまたはライトの一方向として生成されるからね‥‥ ふつうのディスクリプタのように双方向にすればいいのだが
>>641 こういうことをしたいの?
#include <stdio.h>
main()
{
int x;
freopen("/dev/tty", "w+", stdin);
freopen("/dev/tty", "w+", stdout); // not used
fprintf(stdin, "enter a number:"); fflush(stdin);
fscanf(stdin,"%d", &x);
fprintf(stdin, "number is %d\n", x);
}
fprintf, fscanf じゃなく printf, scanf の方がよかったか
>>641 stdoutをfcloseしてから、fileno(stdin)をfdopenすればいい。
ただそれをstdoutとして使うのは処理系依存になる。
マルチスレッド対応のライブラリはstdoutに代入できなくなってるから。
fdreopenがあればいいのだが。
どういう使い方を想定していますか?
>>646 ソケットやシリアルのディスクリプタを引数として
なんか通信して処理する関数があるとするじゃろ?
それに「標準入出力」を渡してTESUTOとかしたいのじゃ。
xinetdなんか使うときにほしいな
>>649 それは、stdin, stdoutにこだわらなければ、fdopenでなんとかなるしな。
>>647 テスト時はmainで切り替えるのも結構簡単。
652 :
デフォルトの名無しさん :2014/05/30(金) 18:57:46.01 ID:1vuEEnaV
OpenBSD の diff コマンドのソースを src.tar.gz というアーカイブの /usr/bin/diff から持ってきて、 わずかに修正後、cygwin でビルドには成功し、一応動作はするのですが、 「diff: : Cannot allocate memory」 というエラーが二回に一回くらい出ます。「:」は二つです。 これは何が原因で、どうやったら直せますか? ソースの修正箇所は、__dead ・__dead void usage(void) の __dead が定義されていなかったので、 #define __dead とした。 ・fgetln() が宣言されていなかったようなので、 呼び出し箇所を my_fgetln() という名前に変更し、 /* $OpenBSD: util.c,v 1.23 2007/09/17 09:28:36 espie Exp $ */ /* $NetBSD: util.c,v 1.10 1996/12/31 17:56:04 christos Exp $ */ /* * Copyright (c) 2001 Marc Espie. */ /* OPENBSD ORIGINAL: usr.bin/make/util.c */ と書かれた、fgeln() のソースを関数名を my_fgetln()に変更して追加した。
653 :
デフォルトの名無しさん :2014/05/30(金) 19:05:18.54 ID:1vuEEnaV
なお、diffのソース・フォルダで"Cannot" "allocate" "memory" と いうキーワードを検索してみましたが、違うキーワードが含まれた 別の文字列の一部として存在しているだけでした。 「diff」という文字列を誰がどうやって表示しているのかさえ分かり ません。__FILE__ マクロも検索してみましたが、見つかりません でした。
argv[0]
655 :
デフォルトの名無しさん :2014/05/30(金) 19:31:55.39 ID:1vuEEnaV
main() 関数の冒頭で、 { char **oargv; // main のローカル変数 oargv = argv; while ((ch = getopt_long(argc, argv, OPTIONS, longopts, NULL)) != -1) { ・・・ lastch = ch; newarg = optind != prevoptind; prevoptind = optind; } argc -= optind; argv += optind; ・・・ set_argstr(oargv, argv); ・・・ } のようになっており、oargv は上記以外では参照されておらず、 argv[0]を参照できる可能性が有るとすれば、 getopt_long() と set_argstr() しかないようです。 これらの関数のうちどちらかが、メッセージを出しているのでしょうか?
餅は餅屋 cygwinはcygwinから
657 :
デフォルトの名無しさん :2014/05/31(土) 07:45:18.26 ID:6bjDZoIF
OpenBSDのdiffソースをもってきた理由は、ライセンスの問題からです。 ところで、エラーの原因が判明しました。 set_argstr()の中で、argsize が負の値になり、xmalloc(argsize) が内部で呼び出しているmalloc(argsize)に失敗し、err(2,NULL) を呼び、 err()が、malloc()が設定したグローバル変数 errno に応じたメッセージ として「Cannot allocate memory」を出していたのでした。 なお、set_argstr(av,ave)のavには、main() に渡された状態の argv がそのまま 渡され、ave には、-オプションを除いた後にあるファイル名まで移動したargvの 値が渡されています。 どうも、OpenBSD では、argv[k] が、0終端文字列が隙間無く並べら れている性質を利用しているようです。 argv[0],argv[1],argv[2],… "cmd名",0,"-opt1",0,"-opt2",0,…,"file1",0,"file2",0 途中の 0x00 を0x20(空白)に置き換えるだけなので、argsize は、 そのままのバイト数で良いからこのようなコードになっている ようです。4足しているのは"diff"という文字列のバイト数の分のようです。
658 :
デフォルトの名無しさん :2014/05/31(土) 07:46:03.82 ID:6bjDZoIF
【修正前】 void set_argstr(char **av, char **ave) { size_t argsize; char **ap; argsize = 4 + *ave - *av + 1; diffargs = xmalloc(argsize); strlcpy(diffargs, "diff", argsize); for (ap = av + 1; ap < ave; ap++) { if (strcmp(*ap, "--") != 0) { strlcat(diffargs, " ", argsize); strlcat(diffargs, *ap, argsize); } } }
659 :
デフォルトの名無しさん :2014/05/31(土) 07:46:54.80 ID:6bjDZoIF
【修正後】 void set_argstr(char **av, char **ave) { size_t argsize; char **ap; argsize = 4; // "diff" 文字列の長さ for (ap = av + 1; ap < ave; ap++) { argsize += 1 + strlen( *ap ); // 間の空白 + 引数の文字数 } argsize++; // 最後の NUL終端文字列 diffargs = xmalloc(argsize); strlcpy(diffargs, "diff", argsize); for (ap = av + 1; ap < ave; ap++) { if (strcmp(*ap, "--") != 0) { strlcat(diffargs, " ", argsize); strlcat(diffargs, *ap, argsize); } } }
660 :
デフォルトの名無しさん :2014/05/31(土) 07:52:02.32 ID:6bjDZoIF
なお、エラー表示に「diff」が表示されているのは、argv[0]を使って いるわけではなく、ライブラリの err() 関数が自分でやってるんですね。 av に argv が渡されているので混乱しそうですが、たまたまです。
ううむ。確かに試してみるとcygwinのargv[n]はバラバラなアドレスだな
この糞なdiffのコードはargvがらみ以外にも地雷がたくさんありそう。
argvがらみでも/usr/bin/diffがargv[0]に渡されたらダメなんじゃないか?
4ってmagic numberが糞だから。
>>661 連続してることに依存したコードは糞。
というか、これぐらいで糞糞って言ってるのは初心者なんだろうな
>>664 プロはクソでも美味しく調理してみせる ってだけで
クソはクソ、とくにそこに変わりはないだろ
666 :
652 :2014/06/01(日) 13:29:53.55 ID:uUGuheMf
OpenBSD の diff ソースは、本質的に複雑な処理の割にはソースが驚くほど 短いです。正直言って、腕のよさを感じました。ソースは: diff.c 11KB diffdir.c 7KB diffreg.c 39KB xmalloc.c 3KB の4つしかソースが無く、本質的には、diffreg.c のみの 1522 行しか ありません。こんなに簡潔に書ける人は、世界でも余りいないのではない でしょうか? ただし、 ・複数の変数を同一行でカンマで区切って宣言している。 ・ローカル変数の名称には1文字など、とても短い物が多い。 ・if () で処理が一行の場合、ブロック {} にせずに書いてある。 ・空行が少ない。 などの特徴があります。
668 :
652 :2014/06/01(日) 18:18:52.63 ID:uUGuheMf
このdiffに関して、プログラミング技術の秀逸さ以外にソースが 短い理由があるとする666に書いたことに加えて、 ・getopt() を使ってオプションの処理が短く出来ている。 ・pread() を使って、lseek(), read()に分けずに書けている。 ・正規表現ライブラリを使っている。 ・fnmatch()なるワイルドカード式のパターンマッチテストを 使っている。 もあるようです。
669 :
652 :2014/06/01(日) 18:20:16.83 ID:uUGuheMf
>>662 ああ、あの 4 は、ソース中に固定的に入っている "diff" 文字列に
対応しているので、argv[0] がどんな風に変わっても大丈夫だと
思います。
670 :
652 :2014/06/01(日) 18:38:13.52 ID:uUGuheMf
さらに: ・goto 文を使っている。
gotoは、finallyの代わりに、エラー処理で使う場合や、 2重ループを一気に抜け出す場合はOK
MonoBehaviourの読み方が気になってプログラミングに集中できません どなたか教えて下さい!
モゥノゥ・ビヘイヴュア
674 :
デフォルトの名無しさん :2014/08/05(火) 13:24:41.41 ID:AfbB56Nf
英和辞書の発音記号を見ればいいだろう
>>672 今頃気がついたが、
ここはUnixプログラミング質問スレであって
Unityプログラミング質問スレじゃねぇ!wwww
分かりづらいボケだな 嫌いじゃない
/tmp/test/下に20140801.txt〜20140805.txt があるときに以下のシェルを流すと ------------------------------ #!/bin/sh files="/tmp/test/" for a in {20140801,20140806} do for filepath in ${files}*${a}* do echo ${filepath} done done ------------------------------ /tmp/test/20140801.txt /tmp/test/*20140806* と表示されてしまいます。 20140806.txtは存在しないので /tmp/test/*20140806* が表示される理由が分かりません。 これを表示しないようにしたいのですが、 if文で存在確認するくらいしかないでしょうか?
コマンドライン展開じゃないから for filepath in ${files}*${a}* のin句にテキストとして ${files}*${a}* の結果として "/tmp/test/*20140806*"が展開されているだけじゃないの?
>>678 なるほど。コマンドライン展開したらできました。
ありがとうございます。
------------------------------
!/bin/sh
files="/tmp/test/"
for a in {20140801,20140806}
do
for filepath in `find ${files} -name ${a}*`
do
echo ${filepath}
done
done
------------------------------
*は何もマッチしないときはそのまま*になる。 一般的には、確かに、ファイルの存在確認をするとかになるんじゃ。 シェルによっては*の挙動を変えられたはず。
>>679 確かに結果としてはできてるけど、
*の振る舞いに違いはないので、 2014086* という名前を探しにいってる。
意図しない物を探しにいっている点で気持ち悪い感じがしないでもない。
682 :
デフォルトの名無しさん :2014/08/07(木) 00:35:24.70 ID:WSmP9CNZ
天才のみなさん教えてください。 「fork」した子プロセスで「popen」したのですが、「pclose」で終えると、「errno」に「29(ESPIPE)」が設定されていました。 以降の処理では前出のエラーによる影響は無く、正常に終了しているに見えるのですが、 子プロセスで「popen」は使用するべきではないのでしょうか? ご教示お願いいたします。
>>682 errnoはエラーしたあとに見るもので、不特定のタイミングで参照して
何か値が入っていたとしても意味はない
pcloseのあとに見たのなら、まずpcloseがエラーしたのか確認すること
685 :
682 :2014/08/07(木) 10:21:02.27 ID:Nj16SWmn
>>684 pcloseの戻り値は「0」でした。
ということは、問題無しと解釈してよろしいのでしょうか?
子プロセスでpopenを使用することも問題無いのでしょうか?
687 :
682 :2014/08/07(木) 11:58:56.21 ID:Nj16SWmn
恐ろしい罠だった
正常終了した後に、errnoを見たの? 何じゃそれ!
正常終了したときもerrnoセットしろよ 何のためのE_OKだよ殺すぞクソが と思ったことはあるのでバカにしたりしない。
どんなコード書いてるのかな?
692 :
デフォルトの名無しさん :2014/08/12(火) 06:15:41.33 ID:7nSDT24w
try{ ここでエラーが発生した時のみ、errnoを設定し、catchへ飛ぶ }catch{ ここでerrnoを参照 } C++風に表現すれば、正常時にはerrnoは設定されていないし、 catchブロックも通らないから、errnoを参照できない
>>690 ×バカにしたりしない
○バカにできない
◎俺もバカ
if(result==1)result=errno; みたいに正規化してから処理るといいよ
マイナス書き忘れた まあいいや
697 :
デフォルトの名無しさん :2014/09/01(月) 11:59:31.72 ID:5QQ1Caz+
Xlibについて質問します。 ウィンドウ・マネージャを使用する一般的な環境では、ウィンドウの淵をドラッグすると ConfigureNotifyを受け取ることができます。 ところで、ドラッグの開始と終了を知ることができる通知は受けられますか? Win32APIで言うところのWM_ENTERSIZEMOVEとWM_EXITSIZEMOVEに相当するものを 探しています。 あるいは何らかの方法で知ることは出来ますか? よろしくおねがいします。
xlibにdragなんて高級なイベントはないです。 自分でdragと何であるか定義して、そのように自分で書いたコードで解釈してください。
よく知らんけどDNDを使うらしい もちろんツールキットならドラッグ&ドロップサポートしてる思うが
700 :
デフォルトの名無しさん :2014/12/23(火) 17:29:19.99 ID:BQHHJ9UZ
ところで、viってなんであんなに変態的な操作感なんでしょうか?
ところで、emacsってなんであんなに変態的な操作感なんでしょうか?
カスタムできるんだから、設定した、またはしてない自分が変態ってことだ。
703 :
デフォルトの名無しさん :2014/12/23(火) 19:03:45.03 ID:BQHHJ9UZ
ただのカーソル移動のためにESCでコマンドモードに戻る必要がある点が 素晴らしく変態的だと感じるのですが、皆さんのご感想はいかがでしょうか?
704 :
デフォルトの名無しさん :2014/12/23(火) 19:06:48.73 ID:BQHHJ9UZ
今、あらためてviをものすごく久しぶりに使ってみたのですが、 insertモードで普通にカーソルキーでカーソル移動できますねw 行追加や行削除もできちゃいます これならいいっすw 勘違いだったのかなぁ。。前はもっと使いにくかった気がしたのですが。
>>704 前ってドンだけ前だよwww
4.1BSDの頃?
今時のviってvi名乗ってるけどvimだったりしない?
>>705 すみません、いちおうvimです
触ってみたのはVIM 7.3です
ちょっと懐かしくなっていろいろいじり始めたのですが、
Windows Tera termのssh経由だと、挙動が違って、insertモードで
カーソルキーが効かなかったり(AとかBとか入力される)
文字が消せなかったり
前経験したイケてない感じに似てます
>>706 ひょっとすると :set nocompatible でなおったりしませんか(自信ないけど)?
// ノーマルモードに戻ったほうが単語単位とかいろんな動き方ができて結局有利
>>707 いやぁ、素晴らしいです!
おかげさまで期待通りの動作になりました
このスレの住人さんはさすがっすね
>>707 すみません、肝心のお礼を言い忘れていました
どうもありがとうございました(ペコリ
>>708-709 おおそれはなによりです。vimrc 作っとくとそれだけで自動的に nocompatible になるので便利
ハッピークリスマス!
MacOS X 10.8.5でpollがうまく動作せず、困っています。 lessなどのpagerで、標準入力をpipeからttyに切り替えるために、 /dev/ttyをstdinにdupする処理をしていますが、Macではその後の stdinに対する有限時間のpollがタイムアウトしなくなります。 サンプルコードはこんな感じです。 #include <fcntl.h> #include <poll.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main() { char *ttyold, *ttynew; int fd; struct pollfd pfd[1]; ttyold = strdup(ttyname(STDIN_FILENO)); fd = open("/dev/tty", O_RDONLY); dup2(fd, STDIN_FILENO); close(fd); ttynew = strdup(ttyname(STDIN_FILENO)); printf("old:%s, new:%s\n", ttyold, ttynew); pfd[0].fd = STDIN_FILENO; pfd[0].events = POLLIN; if (poll(pfd, 1, 1000) == 0) printf("timeout\n"); return 0; }
712 :
711 :2015/02/04(水) 04:26:55.16 ID:2A4M88bu
(承前) NetBSD, FreeBSD, Linux, Solarisでは1秒間でタイムアウトします。 BSDとLinuxでは/dev/ttyをオープンすると、実際に使用中のttyを 開きますが、MacとSolarisは/dev/ttyそのものがopenされるようです。 Mac上で/dev/ttyではなく、元のttyデバイスを明示的にopenして stdinにdupすると、pollはタイムアウトするようになります。 これはOS Xのバグでしょうか?
仕様ですbyステーブンス
714 :
デフォルトの名無しさん :2015/02/04(水) 11:48:47.58 ID:kErMECZ6
杜撰です に見えた
日立社員乙
カレントディレクトリに hoge, text のディレクトリがあって サブディレクトリも含めて hoge の中にある拡張子 .txt ファイルを text に移動させるシェルスクリプトはどう書くのでしょうか?
>>717 find xargs mv
で検索。組み合わせればワンライナーでいける
719 :
717 :
2015/03/04(水) 23:38:12.92 ID:IvKZGLxQ