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.77321デフォルトの名無しさん
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を
置くのはいまいちいけていない気がするのですが、もっとかっこいい方法はないですか?
392デフォルトの名無しさん
2012/03/10(土) 21:38:45.84 1 スレッドライブラリが用意されている環境ならば、
#define errno (* __error())
のようにスレッド毎の変数になっているので安全。
2 システムコールやライブラリでエラーが発生したときに
errnoが 更新させる仕様なので、コールする前にerrnoを
クリアする必要はない。しかしerrnoを比較するとこでエ
ラー判定をしてはいけない。システムコールならば戻り値
が負、ライブラリならばその仕様に従いエラー判定を行う。
#define errno (* __error())
のようにスレッド毎の変数になっているので安全。
2 システムコールやライブラリでエラーが発生したときに
errnoが 更新させる仕様なので、コールする前にerrnoを
クリアする必要はない。しかしerrnoを比較するとこでエ
ラー判定をしてはいけない。システムコールならば戻り値
が負、ライブラリならばその仕様に従いエラー判定を行う。
393デフォルトの名無しさん
2012/03/10(土) 21:41:01.34 >>391
> errno is thread-local; setting it in one thread does not affect its value in any other thread.
うちのLinuxのman errnoから引用。どこかで定められているはずだけど、どの規格か知らない
> errno is thread-local; setting it in one thread does not affect its value in any other thread.
うちのLinuxのman errnoから引用。どこかで定められているはずだけど、どの規格か知らない
394デフォルトの名無しさん
2012/03/10(土) 21:52:08.51395デフォルトの名無しさん
2012/03/10(土) 21:56:50.40396デフォルトの名無しさん
2012/03/11(日) 00:47:10.17 どもです(´・ω・`)
397デフォルトの名無しさん
2012/03/11(日) 03:03:42.12398デフォルトの名無しさん
2012/03/11(日) 07:12:41.24 >>397
日本語でおk
日本語でおk
399デフォルトの名無しさん
2012/03/11(日) 07:59:41.37400デフォルトの名無しさん
2012/03/11(日) 21:40:09.08 おねがいします。
親子関係にないプロセス(PID既知)の生存を確認するための通常の手法はなんですか?
親子関係にないプロセス(PID既知)の生存を確認するための通常の手法はなんですか?
401デフォルトの名無しさん
2012/03/11(日) 21:48:39.59 kill(pid, 0);
402デフォルトの名無しさん
2012/03/11(日) 22:47:06.43 ありがとうございます!
・・・というか、一度はmanに目を通しているから、間違いなく読んでいるはずなのだが・・・
恥をかかないと覚えないということか・・・
・・・というか、一度はmanに目を通しているから、間違いなく読んでいるはずなのだが・・・
恥をかかないと覚えないということか・・・
403デフォルトの名無しさん
2012/03/12(月) 00:05:33.16 >>402
全部暗記できちゃうほうが異常者ですよ。
全部暗記できちゃうほうが異常者ですよ。
404デフォルトの名無しさん
2012/03/12(月) 00:08:19.11 /procという手もある。(OSによっては)
405デフォルトの名無しさん
2012/03/14(水) 02:39:31.61406デフォルトの名無しさん
2012/03/14(水) 10:37:43.36407デフォルトの名無しさん
2012/03/14(水) 12:12:14.56 >>405
中身はいいけど、目次の暗記は必須だろ
中身はいいけど、目次の暗記は必須だろ
408デフォルトの名無しさん
2012/03/14(水) 12:13:49.31 >>405
「どっかで見たなー」 っていう記憶がもっとも大事なんだよ。
「どっかで見たなー」 っていう記憶がもっとも大事なんだよ。
409デフォルトの名無しさん
2012/03/15(木) 16:20:19.04 「もっとも大事」はどうなんだろう?
410デフォルトの名無しさん
2012/03/16(金) 01:18:56.16 教えてください
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関数に入るのかわかりませんでした。
教えて頂けないでしょうか?
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関数に入るのかわかりませんでした。
教えて頂けないでしょうか?
411デフォルトの名無しさん
2012/03/16(金) 01:36:39.64 状態名の関数は全部最後に関数を返してるじゃん?
それがカーネルが次に移る状態なのよ。
その状態で、実行すべき処理を記述してある関数を、
状態そのものの代わりにしている。
void
transition(state_t s)
{
for (;;)
s = (state_t) (*s)();
}
だからこれが状態遷移マシンになるわけ。
requested_transitionは引数とか、シグナルとか、
上の関数を使った状態遷移からは逸脱するものを扱うためにある。
それがカーネルが次に移る状態なのよ。
その状態で、実行すべき処理を記述してある関数を、
状態そのものの代わりにしている。
void
transition(state_t s)
{
for (;;)
s = (state_t) (*s)();
}
だからこれが状態遷移マシンになるわけ。
requested_transitionは引数とか、シグナルとか、
上の関数を使った状態遷移からは逸脱するものを扱うためにある。
412410
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の場所が分からないと思うんですけれど...
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の場所が分からないと思うんですけれど...
413デフォルトの名無しさん
2012/03/17(土) 11:03:10.55 シングルユーザーシェルのプロセスIDがpidで、
do {
} while (wpid != pid && !requested_transition);
で、親プロセス(init)はシングルユーザーシェルの終了を待っている。
(シングルユーザーシェルはインタラクティブシェル)
> 子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか?
親がシェルならsuspendして親シェルに戻るけど、親がシェルじゃないから、
シングルユーザーシェルからkill -STOP $$とかやったら固まるでしょ。
それを避けるためにリスタートする。
do {
} while (wpid != pid && !requested_transition);
で、親プロセス(init)はシングルユーザーシェルの終了を待っている。
(シングルユーザーシェルはインタラクティブシェル)
> 子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか?
親がシェルならsuspendして親シェルに戻るけど、親がシェルじゃないから、
シングルユーザーシェルからkill -STOP $$とかやったら固まるでしょ。
それを避けるためにリスタートする。
414デフォルトの名無しさん
2012/03/17(土) 16:04:37.77 >>412
シングルユーザモードがなにか理解できてる?
シングルユーザモードがなにか理解できてる?
415デフォルトの名無しさん
2012/03/17(土) 16:08:03.24 >>413
シングルユーザモードの典型的なセッションは、
1. シングルユーザモード指定して起動
2. シングルユーザモードのシェルが動く。動いているサービスはほぼ皆無。
3. fsckしたり、パスワード変更したり、criticalなファイル直したり。
4. Ctrl-Dでシングルユーザモードのシェル終了。(exitコマンドでも)
5. マルチユーザーモードへ。(最近のUNIXは起動シーケンスが複雑で、再起動したいケースもままある)
シングルユーザモードの典型的なセッションは、
1. シングルユーザモード指定して起動
2. シングルユーザモードのシェルが動く。動いているサービスはほぼ皆無。
3. fsckしたり、パスワード変更したり、criticalなファイル直したり。
4. Ctrl-Dでシングルユーザモードのシェル終了。(exitコマンドでも)
5. マルチユーザーモードへ。(最近のUNIXは起動シーケンスが複雑で、再起動したいケースもままある)
416410
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'なんですか?
です。
/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'なんですか?
です。
417410
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;
}
つまり、何も指定しない場合は'-'が答えなんですね。
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;
}
つまり、何も指定しない場合は'-'が答えなんですね。
418410
2012/03/18(日) 05:47:21.65 >つまり、何も指定しない場合は'-'が答えなんですね。
すいません。何も指定しない場合は何もないが正解でした。
suwordなんて関数、初めて見ました。
すいません。何も指定しない場合は何もないが正解でした。
suwordなんて関数、初めて見ました。
419デフォルトの名無しさん
2012/03/18(日) 22:40:11.06 たしかに「どっかで見たなー」は大事だけど
そのうち「こんなのがあるはずだ」になって
無いものを探して時間を無駄にすることになる
そのうち「こんなのがあるはずだ」になって
無いものを探して時間を無駄にすることになる
420デフォルトの名無しさん
2012/03/18(日) 22:49:00.71 man 9 store
man 9 fetch
man 9 copy
man 9 fetch
man 9 copy
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか… [BFU★]
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 中国国営メディア「沖縄は日本ではない」…★7 [BFU★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- バービー、 台湾有事の発言の波紋で「たまったもんじゃない」「高市さんに真意は聞きたい」「国民に向けて説明してほしい」 [muffin★]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 高市早苗、岸田政権(当時)に「台湾有事は日本の有事か」という質問をしていた [175344491]
- ケンタッキーの○○○バーガーという予告がアレを想起すると話題に [523957489]
- 【悲報】中国→日本行きの航空チケット、高市有事の影響で50万人分がキャンセルされる [834922174]
- んなっしょい🍬禁止🈲のお🏡
- 【悲報】早速高市首相のせいで全国の民泊でキャンセルラッシュwwwwwwwwwwww 経営者も嘆き「こんな事は初めてだ…」😲 [871926377]
