UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド
前スレ
Part9 http://hibari.2ch.net/test/read.cgi/tech/1205795434/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1147946176/
Part7 http://pc8.2ch.net/test/read.cgi/tech/1127373405/
Part6 http://pc8.2ch.net/test/read.cgi/tech/1116908090/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1105723117/
Part4 http://pc5.2ch.net/test/read.cgi/tech/1095843584/
Part3 http://pc5.2ch.net/test/read.cgi/tech/1085930894/
Part2 http://pc5.2ch.net/test/read.cgi/tech/1055110889/
Part1 http://pc2.2ch.net/tech/kako/992/992057422.html
Part3のミラー
http://makimo.to/2ch/pc5_tech/1085/1085930894.html
Part2のミラー
http://makimo.to/2ch/pc5_tech/1055/1055110889.html
探検
UNIXプログラミング質問すれ Part10
■ このスレッドは過去ログ倉庫に格納されています
1unco ◆manko/yek.
2011/04/18(月) 17:06:36.77292290
2012/02/13(月) 21:39:17.18 なんじゃこの箱枕は!!!!!
('A`)
('A`)
293デフォルトの名無しさん
2012/02/14(火) 07:55:05.11 UNIXのインダイレクションについてレポートにまとめろとかいわれたんだけどUNIXとインダイレクションって
なんか関係あったっけ?
なんか関係あったっけ?
294デフォルトの名無しさん
2012/02/14(火) 08:22:51.30 リダイレクションの聞き間違いだろ。
295デフォルトの名無しさん
2012/02/14(火) 12:40:18.10 >>293
せっかくだからそのままインダイレクションでレポート書いちゃえ
せっかくだからそのままインダイレクションでレポート書いちゃえ
296デフォルトの名無しさん
2012/02/18(土) 03:02:26.53 fork + execlpしたプログラムに引数でstruct構造体を渡すことってできますか?
297デフォルトの名無しさん
2012/02/18(土) 03:03:51.11 馬鹿には無理
298デフォルトの名無しさん
2012/02/18(土) 03:50:08.03 勉強しなおします
299デフォルトの名無しさん
2012/02/18(土) 05:33:46.00 構造体の中身を全部文字列に直して、引数で渡して、その文字列から構造体を作り直せばいいよ
300デフォルトの名無しさん
2012/02/18(土) 09:35:31.88 mmapした領域にコピーしとく、ファイルディスクリプタはそのまま
継承されるから、子プロセスでmmapすりゃいい。
継承されるから、子プロセスでmmapすりゃいい。
301デフォルトの名無しさん
2012/02/18(土) 21:05:03.13 テキストファイルを実行ファイルの一部としてくっつけておいて
実行時にそれを普通のファイルみたいにopen/read/writeすることは可能でしょうか?
実行時にそれを普通のファイルみたいにopen/read/writeすることは可能でしょうか?
302デフォルトの名無しさん
2012/02/18(土) 21:13:51.06 実行するユーザがread, write権限もってりゃできる。
そういうユーザーは実行ファイルを壊すことも、悪質なプログラムに
中身をすり替える事も可能になる。
そういうユーザーは実行ファイルを壊すことも、悪質なプログラムに
中身をすり替える事も可能になる。
303デフォルトの名無しさん
2012/02/18(土) 21:48:35.70 で、どうやって?
304デフォルトの名無しさん
2012/02/18(土) 21:59:22.91 自分が入ってたファイルを書き込みモードでオープンできるかどうかは、
ファイルシステムに拠るんじゃないかな。
パーミッション的にOKだったとしても。
ファイルシステムに拠るんじゃないかな。
パーミッション的にOKだったとしても。
305デフォルトの名無しさん
2012/02/18(土) 22:01:55.04 ファイルシステムじゃなくてOSに拠るのかも。
とりあえずbsd系では平気そうだけどlinuxでは無理だよね。
とりあえずbsd系では平気そうだけどlinuxでは無理だよね。
306デフォルトの名無しさん
2012/02/18(土) 22:26:29.07 Solarisなんかも書き込みはアウト。
Text file is busyになる。
BSDもダメなはずだが…
一つの実行ファイルを配布して、それを実行しながら書き換えようってのは無理。
Mac OS Xならリソースフォークを書き換えればいいが。
Text file is busyになる。
BSDもダメなはずだが…
一つの実行ファイルを配布して、それを実行しながら書き換えようってのは無理。
Mac OS Xならリソースフォークを書き換えればいいが。
307デフォルトの名無しさん
2012/02/18(土) 22:33:01.16 >>306
BSDは手元にないからわからないけど、OS Xは書き込めるよ。
BSDは手元にないからわからないけど、OS Xは書き込めるよ。
308デフォルトの名無しさん
2012/02/19(日) 01:26:23.23 forkしたあとなら出来る?
309デフォルトの名無しさん
2012/02/19(日) 01:36:19.24 textをbusyにしているプロセスが2つに増えるだけ。
310デフォルトの名無しさん
2012/02/19(日) 01:48:39.19 BSDとかMachの仮想記憶だと、同じページをマップしてても書き換えたらコピーが作られるんじゃないの?
だからOS Xは書き込める。
だからOS Xは書き込める。
311デフォルトの名無しさん
2012/02/19(日) 01:55:39.11 それはどのUNIXでも同じ。
ただし書き換えられるのはデータ領域。
実行ファイルが書き換えられるわけじゃない。
Mac OS X(Darwin)は同一ファイル内のリソースフォークを書き換える必要があるから、
HFS+のファイルはそう扱ってる。UFS(今はもうないが)上だと違う。
ただし書き換えられるのはデータ領域。
実行ファイルが書き換えられるわけじゃない。
Mac OS X(Darwin)は同一ファイル内のリソースフォークを書き換える必要があるから、
HFS+のファイルはそう扱ってる。UFS(今はもうないが)上だと違う。
312デフォルトの名無しさん
2012/02/19(日) 02:02:29.64 ああそうなんだ。OS Xでもファイルシステム依存なのね。
313デフォルトの名無しさん
2012/02/19(日) 04:12:08.40 最終的に変更されたバイナリが残ればいいのなら、プログラム起動時にどこかにコピーを作ってそれで上書きすれば
その上書きした方に対して自由に読み書きできると思うんだが、いろいろ怖い
その上書きした方に対して自由に読み書きできると思うんだが、いろいろ怖い
314デフォルトの名無しさん
2012/02/19(日) 04:22:57.33 おまえらautoconfわかる?
これでx86プロセッサーのコア数を確認するマクロあったら教えてくれ。
http://www.gnu.org/software/autoconf-archive/The-Macros.html#The-Macros
ここに有志が書いたマクロについてのマニュアルがあるから、探してくれ。
誰か英語が得意な奴よろ。
もし無いなら誰かm4マクロでx86プロセッサーのコア数確認のマクロ書いてくれ。
これCPUの資料な。
たぶんアセンブラの命令とかで調べられるはずだから、
ここ読めばどっかに載ってるから。よろ。
http://download.intel.com/jp/developer/jpdoc/Processor_Identification_071405_i.pdf
http://download.intel.com/jp/developer/jpdoc/248966-024JA.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol1_Online_i.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2A_i.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2B_i.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol3_i.pdf
これでx86プロセッサーのコア数を確認するマクロあったら教えてくれ。
http://www.gnu.org/software/autoconf-archive/The-Macros.html#The-Macros
ここに有志が書いたマクロについてのマニュアルがあるから、探してくれ。
誰か英語が得意な奴よろ。
もし無いなら誰かm4マクロでx86プロセッサーのコア数確認のマクロ書いてくれ。
これCPUの資料な。
たぶんアセンブラの命令とかで調べられるはずだから、
ここ読めばどっかに載ってるから。よろ。
http://download.intel.com/jp/developer/jpdoc/Processor_Identification_071405_i.pdf
http://download.intel.com/jp/developer/jpdoc/248966-024JA.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol1_Online_i.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2A_i.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2B_i.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol3_i.pdf
315314
2012/02/19(日) 04:25:44.64316デフォルトの名無しさん
2012/02/19(日) 08:45:12.06 同じ問題で、画像データやアイコンデータなんかはどうやって管理しているの?
317デフォルトの名無しさん
2012/02/19(日) 09:29:28.41 なにが?
318デフォルトの名無しさん
2012/02/19(日) 10:27:43.92319デフォルトの名無しさん
2012/02/19(日) 10:43:27.62 リードオンリーなら別の問題だ。実行ファイルに埋め込む場合もある。
320デフォルトの名無しさん
2012/02/19(日) 12:29:42.23 実行ファイルに埋め込んだ場合、「どこにあるか」を知らないと読み出しできないではないか・・・
すんません、そういう関数や手順があるなら教えてください
一般的なLinuxでgcc|g++を想定しての話です
すんません、そういう関数や手順があるなら教えてください
一般的なLinuxでgcc|g++を想定しての話です
321デフォルトの名無しさん
2012/02/19(日) 12:35:41.80 読むだけならデータ化すればいいだけだろ。xpmみたいに。
322デフォルトの名無しさん
2012/02/19(日) 12:44:08.98 >>320
GNU ldなら
ld -r -b binary -o foo.o foo.jpg
でfoo.jpgをオブジェクトファイルにすることができる。
nm foo.oすりゃわかるが、_binary_foo_start、_binary_end_start
というシンボルが定義される。
このオブジェクトファイルを普通にリンクすれば直にアクセスできる。
リードする必要すらない。
GNU ldなら
ld -r -b binary -o foo.o foo.jpg
でfoo.jpgをオブジェクトファイルにすることができる。
nm foo.oすりゃわかるが、_binary_foo_start、_binary_end_start
というシンボルが定義される。
このオブジェクトファイルを普通にリンクすれば直にアクセスできる。
リードする必要すらない。
323デフォルトの名無しさん
2012/02/19(日) 12:45:22.01 おっと
× _binary_foo_start、_binary_end_start
○ _binary_foo_start、_binary_foo_end
× _binary_foo_start、_binary_end_start
○ _binary_foo_start、_binary_foo_end
324デフォルトの名無しさん
2012/02/19(日) 12:46:13.97 それをどうやって、(その画像データを読むプログラムの)実行ファイルにくっつけるの?
まさか、異様に長い配列を?・・・・て、静的データを置く領域が足りなくて無理だし
まさか、異様に長い配列を?・・・・て、静的データを置く領域が足りなくて無理だし
325デフォルトの名無しさん
2012/02/19(日) 12:47:30.16326デフォルトの名無しさん
2012/02/19(日) 12:50:51.17 別のファイルにしろ
327デフォルトの名無しさん
2012/02/19(日) 12:55:13.43 いやだ!
328デフォルトの名無しさん
2012/02/19(日) 12:56:29.98329デフォルトの名無しさん
2012/02/20(月) 08:52:20.58330デフォルトの名無しさん
2012/02/20(月) 10:20:53.72331デフォルトの名無しさん
2012/02/20(月) 18:05:11.00 unixでdllのような動的ライブラリーはありますか?
どうやって作ればいいですか
どうやって作ればいいですか
332デフォルトの名無しさん
2012/02/20(月) 18:11:55.71 >>331
なんで「unix 動的ライブラリ」でググらないの?
なんで「unix 動的ライブラリ」でググらないの?
333デフォルトの名無しさん
2012/02/20(月) 18:41:49.66 組み込みとかだとサポートしてないアーキテクチャとかあるんかね。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ごとの違いを一通り知っておく必要がある。
あるけど、OSによって作り方も使い方も違う。
LinuxとFreeBSDとSolarisの間でも微妙に違うし、MacOS Xとなるとかなり違う。
その辺の違いを埋めようってことでGNU libtoolというのが作られているけど、
こいつがまた色々とアレで、無意味で余計で有害なことをしてくれることがある。
FreeBSDでバージョン番号の付け方が致命的に間違っているとか。
結局、libtoolを使いこなすためにもOSごとの違いを一通り知っておく必要がある。
336デフォルトの名無しさん
2012/02/20(月) 19:06:35.44 バージョン管理する気ないなら、軽微な差しかないと思っていい。
337デフォルトの名無しさん
2012/02/20(月) 19:08:02.12 >>335
バージョン番号の付け方って?
libaaa.so.0.0.0
のような、最後に付加される0.0.0のことか?
これfirefox9.0.1などの数字とは根本的に意味が違うものなのだが、その辺はおわかり?
バージョン番号の付け方って?
libaaa.so.0.0.0
のような、最後に付加される0.0.0のことか?
これfirefox9.0.1などの数字とは根本的に意味が違うものなのだが、その辺はおわかり?
338デフォルトの名無しさん
2012/02/20(月) 19:12:55.43 最近のFirefoxもバージョンの振り方間違ってると思うw
339デフォルトの名無しさん
2012/02/20(月) 19:16:16.45340デフォルトの名無しさん
2012/02/20(月) 19:17:37.67 >>339
嘘教えんなwww
嘘教えんなwww
341デフォルトの名無しさん
2012/02/20(月) 19:22:37.14 Mac OS Xではこんなような感じで作った記憶がある。
cc -fno-common -c a.o
cc -dynamiclib -flat_namespace -undefined suppress -o liba.1.0.0.dylib a.o
cc -fno-common -c a.o
cc -dynamiclib -flat_namespace -undefined suppress -o liba.1.0.0.dylib a.o
342デフォルトの名無しさん
2012/02/20(月) 20:07:21.79 >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 <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./
344デフォルトの名無しさん
2012/02/20(月) 21:52:07.46 #include <hello.h> のいみがわかりません
345343
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
最も基本的な方法だと以下のようになる。
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
346343
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
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
347343
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の対応状況に状況に応じて、都合良い方でビルドされる。(基本的には動的ライブラリの使用が優先される。優先度の変更はオプションで行える)
これは何を意味するかというと、動的ライブラリーが使用できない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の対応状況に状況に応じて、都合良い方でビルドされる。(基本的には動的ライブラリの使用が優先される。優先度の変更はオプションで行える)
348デフォルトの名無しさん
2012/02/20(月) 22:36:01.70 libtoolとかautotoolとか移植を簡単にするためのツールなのに、
そのツール自体の移植が非常に困難という矛盾。
考えた奴死ねばいいのに。
そのツール自体の移植が非常に困難という矛盾。
考えた奴死ねばいいのに。
349デフォルトの名無しさん
2012/02/21(火) 00:17:38.61 >>348
?
なにを言ってるんだ?
よく考えてみろ
移植という作業の、面倒な部分のみを『抽出』して、そこを隠蔽するツールがlibtoolやautoconf。
つまり、アプリの多プラットフォーム対応の際の、面倒な部分のみを抽出した問題。この問題を解く作業こそが、libtoolやautomakeの移植作業というもの。
面倒な問題だけを一ヶ所にあつめて、問題を解こうとしてるのだから、困難なのは当然だろ。
逆に、抽出した困難さが、もしも簡単に解ける程度であれば(簡単にlibtoolを移植できたのであれば)、
それはもともと、切り分けるに値しないほど簡単な問題だったということになる。
?
なにを言ってるんだ?
よく考えてみろ
移植という作業の、面倒な部分のみを『抽出』して、そこを隠蔽するツールがlibtoolやautoconf。
つまり、アプリの多プラットフォーム対応の際の、面倒な部分のみを抽出した問題。この問題を解く作業こそが、libtoolやautomakeの移植作業というもの。
面倒な問題だけを一ヶ所にあつめて、問題を解こうとしてるのだから、困難なのは当然だろ。
逆に、抽出した困難さが、もしも簡単に解ける程度であれば(簡単にlibtoolを移植できたのであれば)、
それはもともと、切り分けるに値しないほど簡単な問題だったということになる。
350デフォルトの名無しさん
2012/02/21(火) 00:24:37.56 なんで、システムライブラリ、ヘッダーをconfigureの度にスキャンするんだ?
バカ丸出しのシステムだろ。
dllのリンクのために何行のツール作ってるんだ?
リンクのために5行以上の記述が必要なシステムなんか見たことないぞ。
バカ丸出しのシステムだろ。
dllのリンクのために何行のツール作ってるんだ?
リンクのために5行以上の記述が必要なシステムなんか見たことないぞ。
351デフォルトの名無しさん
2012/02/21(火) 00:31:39.51 まあ色々なプラットフォームでのビルドをサポートするためのツールだし。
あとキャッシュを消さなければ毎回スキャンはしないかも。
あとキャッシュを消さなければ毎回スキャンはしないかも。
352デフォルトの名無しさん
2012/02/21(火) 00:46:44.25353デフォルトの名無しさん
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で実行環境情報を積極的に得るようにすれば、プログラム最適化の幅が広がるはず。
./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で実行環境情報を積極的に得るようにすれば、プログラム最適化の幅が広がるはず。
354デフォルトの名無しさん
2012/02/21(火) 01:02:28.82 thx!!
355デフォルトの名無しさん
2012/02/21(火) 01:10:16.32 ちなみにCMakeはもっとスゴイぞ!
356デフォルトの名無しさん
2012/02/21(火) 01:26:53.76357デフォルトの名無しさん
2012/02/21(火) 01:31:38.51 バカなautotools
checking ...
これが世界中でどれだけ行われてるんだ? その電力で何人のアフリカの子供が…
システムライブラリなんか一回スキャンしてデータベース作ればOK。
考えた奴死ね。
checking ...
これが世界中でどれだけ行われてるんだ? その電力で何人のアフリカの子供が…
システムライブラリなんか一回スキャンしてデータベース作ればOK。
考えた奴死ね。
358デフォルトの名無しさん
2012/02/21(火) 01:35:41.52 >>353
> たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。
autoconfが対応しているOS場合の事。対応していないときに変更箇所を探して、m4のマニュアル読みながらm4マクロ書いて…
Makefileに
NUM_CORE=4
5秒で終わるわ。
> たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。
autoconfが対応しているOS場合の事。対応していないときに変更箇所を探して、m4のマニュアル読みながらm4マクロ書いて…
Makefileに
NUM_CORE=4
5秒で終わるわ。
359デフォルトの名無しさん
2012/02/21(火) 01:41:05.56 もうちょっとましな指摘は書けないのかよw
360デフォルトの名無しさん
2012/02/21(火) 02:55:02.78 >>357
おまい頭良いな
おまい頭良いな
361デフォルトの名無しさん
2012/02/21(火) 07:59:40.53 アフリカの子供が不幸なのはアフリカの大人がDQNだからだよ
日本で言えば、赤ん坊を車に放置してパチンコ台の前に陣取る親みたいなものだ
日本で言えば、赤ん坊を車に放置してパチンコ台の前に陣取る親みたいなものだ
362デフォルトの名無しさん
2012/02/21(火) 09:06:59.31 >>357
話はそんな簡単じゃないみたいだぞ。
例えばソフトをビルドするときにある関数が期待した振る舞い(フレーバー)で利用可能
かどうか、はシステムライブラリにそれがあるかだけでは決まらない(例えばコンパイラ
のオプション等)ので。
話はそんな簡単じゃないみたいだぞ。
例えばソフトをビルドするときにある関数が期待した振る舞い(フレーバー)で利用可能
かどうか、はシステムライブラリにそれがあるかだけでは決まらない(例えばコンパイラ
のオプション等)ので。
363デフォルトの名無しさん
2012/02/21(火) 09:17:44.19 >>362
configureが検出したものをオプションと一緒に記録しておけばいいんじゃない?
コンパイルオプションで挙動が変わる関数くらい数えられる程度では?
若しくは、そういった特殊な挙動を要求するものだけはDBを使わないようにすればいい
configureごとに全く同じ処理をキャッシュできればそれだけで随分速くなる
configureが検出したものをオプションと一緒に記録しておけばいいんじゃない?
コンパイルオプションで挙動が変わる関数くらい数えられる程度では?
若しくは、そういった特殊な挙動を要求するものだけはDBを使わないようにすればいい
configureごとに全く同じ処理をキャッシュできればそれだけで随分速くなる
364デフォルトの名無しさん
2012/02/21(火) 09:41:37.47 オプションに利用可能性が依存するって、どの規格(c90, c99, ...)を使うかくらい。
その以外で振る舞いや有無が変わる関数なんて使ってられんわ。使う価値ないね。
もしあるなら、そんなクズな関数を捨てれば何人の餓えているアフリカの子供が…
その以外で振る舞いや有無が変わる関数なんて使ってられんわ。使う価値ないね。
もしあるなら、そんなクズな関数を捨てれば何人の餓えているアフリカの子供が…
365デフォルトの名無しさん
2012/02/21(火) 10:15:13.00 過度の汎用性を求めて(といっても所詮Unix限定だけど)汚い設定ファイル地獄
便利さも体感できないって、なんだか一昔前のJava + J2SE + メタフレームワーク地獄
みたい
m4とXMLの違いがあるけどね
今更m4なんて弄りたがるの変態ぐらいでしょ
それはそうと、.laや.pcにフルパス埋め込まれるのは何で?
あれrelocateしにくいから嫌なんだけど
.aや.soにはそんなもん埋め込まれないのに
便利さも体感できないって、なんだか一昔前のJava + J2SE + メタフレームワーク地獄
みたい
m4とXMLの違いがあるけどね
今更m4なんて弄りたがるの変態ぐらいでしょ
それはそうと、.laや.pcにフルパス埋め込まれるのは何で?
あれrelocateしにくいから嫌なんだけど
.aや.soにはそんなもん埋め込まれないのに
366デフォルトの名無しさん
2012/02/21(火) 10:35:54.54 >>364
きみがパソコンすてればアフリカの・・・
きみがパソコンすてればアフリカの・・・
367デフォルトの名無しさん
2012/02/21(火) 11:12:28.96 さすがに古臭い感じはする。
こんだけ広まっちゃうと今さらどうこうするのは難しいだろうけど。
こんだけ広まっちゃうと今さらどうこうするのは難しいだろうけど。
368デフォルトの名無しさん
2012/02/21(火) 13:39:46.81369デフォルトの名無しさん
2012/02/21(火) 15:03:36.68370デフォルトの名無しさん
2012/02/21(火) 17:40:15.55371デフォルトの名無しさん
2012/02/21(火) 18:15:57.69 >>368
規格に関するオプション以外であるなら実例だせば議論が進むぞ。
「ある」だけ連呼すんなよ。
それが人間が管理できる以上の組み合わせならautoconfは意味があるわけだし、
数個なら意味なしという事だ。
規格に関するオプション以外であるなら実例だせば議論が進むぞ。
「ある」だけ連呼すんなよ。
それが人間が管理できる以上の組み合わせならautoconfは意味があるわけだし、
数個なら意味なしという事だ。
372デフォルトの名無しさん
2012/02/22(水) 06:42:18.85373デフォルトの名無しさん
2012/02/22(水) 09:59:24.55 > いや、コンパイラのオプションでかなり変わるっしょ。
つまり、これの実例は挙げられないという事だね。
> 話が通じてないならいいよ。
捨て台詞がみっとも茄子。
つまり、これの実例は挙げられないという事だね。
> 話が通じてないならいいよ。
捨て台詞がみっとも茄子。
374デフォルトの名無しさん
2012/02/22(水) 15:20:49.78 いい加減にして
375デフォルトの名無しさん
2012/02/23(木) 18:46:17.26 雲丹板って人減ってます?
376デフォルトの名無しさん
2012/02/23(木) 19:45:24.15 >>337
-version-info CURRENT:REVISION:AGE
と指示したら、標準的なUNIX系環境では、
libfoo.so.CURRENT-AGE.AGE.REVISION
となるべきだよね。ところがlibtoolは、FreeBSD,NetBSD,HP-UXなどでは、
libfoo.so.CURRENT.AGE.REVISION
というバージョン番号を振ってしまう。
-version-info CURRENT:REVISION:AGE
と指示したら、標準的なUNIX系環境では、
libfoo.so.CURRENT-AGE.AGE.REVISION
となるべきだよね。ところがlibtoolは、FreeBSD,NetBSD,HP-UXなどでは、
libfoo.so.CURRENT.AGE.REVISION
というバージョン番号を振ってしまう。
377デフォルトの名無しさん
2012/02/23(木) 19:57:38.09 >>375
2ch全体が絶滅危惧種
2ch全体が絶滅危惧種
378デフォルトの名無しさん
2012/02/24(金) 10:00:26.97 非同期シグナルセーフなprintf誰か作ってー
379デフォルトの名無しさん
2012/02/24(金) 10:17:07.20 そういえば、memcpyは非同期シグナルセーフじゃ無いんだな
380デフォルトの名無しさん
2012/02/24(金) 16:59:31.03 どなたか教えて頂けたらなと思います。
多分Linuxだけっぽいのですが、TCPでローカルホストにあるポートにconnect()するとして、
自分自身のソケットに接続できることに気づきました。
以下、pythonでですが、
from socket import *
s = socket()
s.bind(('', 5656))
s.connect(('localhost', 5656))
↑connect出来てしまう。netstatでみるとESTABLISHEDが
1つだけあるような状況になります。
明示的にbindしてなくても、たまたま自分自身が開いた
エフェメラルポートにも接続できちゃうみたいです。
感覚的には間違った動作に思えますが、そういう仕様なのでしょうか。
多分Linuxだけっぽいのですが、TCPでローカルホストにあるポートにconnect()するとして、
自分自身のソケットに接続できることに気づきました。
以下、pythonでですが、
from socket import *
s = socket()
s.bind(('', 5656))
s.connect(('localhost', 5656))
↑connect出来てしまう。netstatでみるとESTABLISHEDが
1つだけあるような状況になります。
明示的にbindしてなくても、たまたま自分自身が開いた
エフェメラルポートにも接続できちゃうみたいです。
感覚的には間違った動作に思えますが、そういう仕様なのでしょうか。
381デフォルトの名無しさん
2012/02/24(金) 17:17:37.05 TCPの接続は<src IP, src port, dst IP, dst port>の四つ組で識別できる。
たまたま1と3、2と4が一緒でも特に支障はない。
プロトコル状態遷移の表の作り方によっては禁止もできるが。
たまたま1と3、2と4が一緒でも特に支障はない。
プロトコル状態遷移の表の作り方によっては禁止もできるが。
382デフォルトの名無しさん
2012/02/24(金) 17:33:05.37 お前ウソついてない? listenしてないのにconnectできちゃうの?
pythonのsocketは知らんけど、勝手にlistenする?
> from socket import *
> s = socket()
> s.bind(('', 5656))
> s.connect(('localhost', 5656))
pythonのsocketは知らんけど、勝手にlistenする?
> from socket import *
> s = socket()
> s.bind(('', 5656))
> s.connect(('localhost', 5656))
383デフォルトの名無しさん
2012/02/24(金) 17:55:14.86384デフォルトの名無しさん
2012/02/24(金) 18:57:43.25 >>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");
}
> 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");
}
385デフォルトの名無しさん
2012/02/24(金) 20:03:31.13 カマー本とかスティーブンス本とか、
ソケットプログラミングFAQに詳しく書いてあるから読んでみてねん。
ソケットプログラミングFAQに詳しく書いてあるから読んでみてねん。
386380
2012/02/24(金) 20:19:31.29 >>381
>>383
>>385
ありがとうございます、勉強になります。
仕様上はありってところは驚きです。
スティーブンスの詳解TCP/IPとUNIXネットワークプログラミングならありますので、読み直してみます。
試しにバーチャルで2つLinuxマシン用意して、
お互いにconnectしあうようにしたら繋がってしまいました。
SYN_SENTを維持しなきゃダメみたいなんで、
RSTが届かないようにフィルタする必要がありましたけど。
ちなみにpythonじゃなくても同じですよ。
Cで書くとわかりづらいかな?と思ったのでpythonで書きました。
ってことは、LinuxでTCPを使うような時って、
エフェメラルポートを受信ポートに使うのって危険?
予期せず自分自身のソケットに接続してしまうかもしれない。
まあ、どっちかと言うと先にポートが使われてて開けられなかった、とかの方がありそうですけどね。
>>383
>>385
ありがとうございます、勉強になります。
仕様上はありってところは驚きです。
スティーブンスの詳解TCP/IPとUNIXネットワークプログラミングならありますので、読み直してみます。
試しにバーチャルで2つLinuxマシン用意して、
お互いにconnectしあうようにしたら繋がってしまいました。
SYN_SENTを維持しなきゃダメみたいなんで、
RSTが届かないようにフィルタする必要がありましたけど。
ちなみにpythonじゃなくても同じですよ。
Cで書くとわかりづらいかな?と思ったのでpythonで書きました。
ってことは、LinuxでTCPを使うような時って、
エフェメラルポートを受信ポートに使うのって危険?
予期せず自分自身のソケットに接続してしまうかもしれない。
まあ、どっちかと言うと先にポートが使われてて開けられなかった、とかの方がありそうですけどね。
387デフォルトの名無しさん
2012/02/24(金) 21:48:04.19 確かネットワークプログラミングスレってのがあったと思うけど、それはまあいいとして、
ソケットプログラミングのFAQは必読。すごくいいFAQ。
プログラミング系FAQのベストの一つなのは間違いない。
以下は日本語訳。
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
ソケットプログラミングのFAQは必読。すごくいいFAQ。
プログラミング系FAQのベストの一つなのは間違いない。
以下は日本語訳。
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
388380
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になるのに別の手段が存在するということでしょうか?
>それから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になるのに別の手段が存在するということでしょうか?
389デフォルトの名無しさん
2012/02/25(土) 12:34:32.23 一応ネットワークプログラミングスレで聞いた方がよさそうだと言っとく
http://toro.2ch.net/test/read.cgi/tech/1293284816/
http://toro.2ch.net/test/read.cgi/tech/1293284816/
391デフォルトの名無しさん
2012/03/10(土) 20:50:36.82 単純なネタで恐縮ですが、errnoは並列化プログラミングに対して安全なのでしょうか?
主要な並列化手法の実装だけでもかまわないので、ご存知の方はコメントください。
また、チェック対象となるシステムコールやライブラリ関数の直前にいちいちerrno=0を
置くのはいまいちいけていない気がするのですが、もっとかっこいい方法はないですか?
主要な並列化手法の実装だけでもかまわないので、ご存知の方はコメントください。
また、チェック対象となるシステムコールやライブラリ関数の直前にいちいちerrno=0を
置くのはいまいちいけていない気がするのですが、もっとかっこいい方法はないですか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- Perfume・あ~ちゃんの結婚相手の一般男性、吉田カバンの社長と判明 [977261419]
- 急に真冬かよ!!!⛄❄✨
- 地球から無限km先の場所ってどうなっているの?
- お前らインターネット大規模障害起きてたとき何してた
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
- 日本、高市のお陰で破滅に近づくwwwwwwww
