UNIXプログラミング質問すれ Part10

■ このスレッドは過去ログ倉庫に格納されています
2011/04/18(月) 17:06:36.77
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 ;
292290
垢版 |
2012/02/13(月) 21:39:17.18
なんじゃこの箱枕は!!!!!
('A`)
293デフォルトの名無しさん
垢版 |
2012/02/14(火) 07:55:05.11
UNIXのインダイレクションについてレポートにまとめろとかいわれたんだけどUNIXとインダイレクションって
なんか関係あったっけ?
2012/02/14(火) 08:22:51.30
リダイレクションの聞き間違いだろ。
2012/02/14(火) 12:40:18.10
>>293
せっかくだからそのままインダイレクションでレポート書いちゃえ
2012/02/18(土) 03:02:26.53
fork + execlpしたプログラムに引数でstruct構造体を渡すことってできますか?
2012/02/18(土) 03:03:51.11
馬鹿には無理
2012/02/18(土) 03:50:08.03
勉強しなおします
2012/02/18(土) 05:33:46.00
構造体の中身を全部文字列に直して、引数で渡して、その文字列から構造体を作り直せばいいよ
2012/02/18(土) 09:35:31.88
mmapした領域にコピーしとく、ファイルディスクリプタはそのまま
継承されるから、子プロセスでmmapすりゃいい。
301デフォルトの名無しさん
垢版 |
2012/02/18(土) 21:05:03.13
テキストファイルを実行ファイルの一部としてくっつけておいて
実行時にそれを普通のファイルみたいにopen/read/writeすることは可能でしょうか?
2012/02/18(土) 21:13:51.06
実行するユーザがread, write権限もってりゃできる。
そういうユーザーは実行ファイルを壊すことも、悪質なプログラムに
中身をすり替える事も可能になる。
2012/02/18(土) 21:48:35.70
で、どうやって?
2012/02/18(土) 21:59:22.91
自分が入ってたファイルを書き込みモードでオープンできるかどうかは、
ファイルシステムに拠るんじゃないかな。
パーミッション的にOKだったとしても。
2012/02/18(土) 22:01:55.04
ファイルシステムじゃなくてOSに拠るのかも。
とりあえずbsd系では平気そうだけどlinuxでは無理だよね。
2012/02/18(土) 22:26:29.07
Solarisなんかも書き込みはアウト。
Text file is busyになる。
BSDもダメなはずだが…

一つの実行ファイルを配布して、それを実行しながら書き換えようってのは無理。
Mac OS Xならリソースフォークを書き換えればいいが。
2012/02/18(土) 22:33:01.16
>>306
BSDは手元にないからわからないけど、OS Xは書き込めるよ。
2012/02/19(日) 01:26:23.23
forkしたあとなら出来る?
2012/02/19(日) 01:36:19.24
textをbusyにしているプロセスが2つに増えるだけ。
2012/02/19(日) 01:48:39.19
BSDとかMachの仮想記憶だと、同じページをマップしてても書き換えたらコピーが作られるんじゃないの?
だからOS Xは書き込める。

2012/02/19(日) 01:55:39.11
それはどのUNIXでも同じ。
ただし書き換えられるのはデータ領域。
実行ファイルが書き換えられるわけじゃない。

Mac OS X(Darwin)は同一ファイル内のリソースフォークを書き換える必要があるから、
HFS+のファイルはそう扱ってる。UFS(今はもうないが)上だと違う。
2012/02/19(日) 02:02:29.64
ああそうなんだ。OS Xでもファイルシステム依存なのね。
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
315314
垢版 |
2012/02/19(日) 04:25:44.64
やっぱいいわ、
見つかったわ
http://www.gnu.org/software/autoconf-archive/ax_count_cpus.html#ax_count_cpus

じゃあの
316デフォルトの名無しさん
垢版 |
2012/02/19(日) 08:45:12.06
同じ問題で、画像データやアイコンデータなんかはどうやって管理しているの?
2012/02/19(日) 09:29:28.41
なにが?
2012/02/19(日) 10:27:43.92
>>316
パッケージ化して配布。
Macだってリモートファイルシステムではリソースフォークをうまく管理できないので、
buldleにして配布することが推奨されてる。
2012/02/19(日) 10:43:27.62
リードオンリーなら別の問題だ。実行ファイルに埋め込む場合もある。
2012/02/19(日) 12:29:42.23
実行ファイルに埋め込んだ場合、「どこにあるか」を知らないと読み出しできないではないか・・・
すんません、そういう関数や手順があるなら教えてください
一般的なLinuxでgcc|g++を想定しての話です
2012/02/19(日) 12:35:41.80
読むだけならデータ化すればいいだけだろ。xpmみたいに。
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
というシンボルが定義される。
このオブジェクトファイルを普通にリンクすれば直にアクセスできる。
リードする必要すらない。
2012/02/19(日) 12:45:22.01
おっと
× _binary_foo_start、_binary_end_start
○ _binary_foo_start、_binary_foo_end
2012/02/19(日) 12:46:13.97
それをどうやって、(その画像データを読むプログラムの)実行ファイルにくっつけるの?
まさか、異様に長い配列を?・・・・て、静的データを置く領域が足りなくて無理だし
2012/02/19(日) 12:47:30.16
>>324は、>>321へのQ
2012/02/19(日) 12:50:51.17
別のファイルにしろ
2012/02/19(日) 12:55:13.43
いやだ!
2012/02/19(日) 12:56:29.98
>>322
>>323
どうもありがとうございます
仕事場のマシンで実験してみます
2012/02/20(月) 08:52:20.58
>>324,328
データサイズ的には>>321と同じだぞ。
> 静的データを置く領域が足りなくて無理だし
なら、>>322も置けないという事にかわりはない。
2012/02/20(月) 10:20:53.72
>>322
そういえばMac OS Xのバイナリにはアイコン用のセグメントってのが定義されてる。
今は有効かどうかわからないが、大昔のNeXTの頃はそこにアプリのアイコン画像を
保存していた。
331デフォルトの名無しさん
垢版 |
2012/02/20(月) 18:05:11.00
unixでdllのような動的ライブラリーはありますか?
どうやって作ればいいですか
2012/02/20(月) 18:11:55.71
>>331
なんで「unix 動的ライブラリ」でググらないの?
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ごとの違いを一通り知っておく必要がある。
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などの数字とは根本的に意味が違うものなのだが、その辺はおわかり?
2012/02/20(月) 19:12:55.43
最近のFirefoxもバージョンの振り方間違ってると思うw
2012/02/20(月) 19:16:16.45
>>331
gcc -fPIC -c a.c
gcc -shared -Wl,-soname,liba.so -o liba.so a.o
2012/02/20(月) 19:17:37.67
>>339
嘘教えんなwww
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
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./
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
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
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の対応状況に状況に応じて、都合良い方でビルドされる。(基本的には動的ライブラリの使用が優先される。優先度の変更はオプションで行える)
2012/02/20(月) 22:36:01.70
libtoolとかautotoolとか移植を簡単にするためのツールなのに、
そのツール自体の移植が非常に困難という矛盾。
考えた奴死ねばいいのに。
349デフォルトの名無しさん
垢版 |
2012/02/21(火) 00:17:38.61
>>348

なにを言ってるんだ?
よく考えてみろ



移植という作業の、面倒な部分のみを『抽出』して、そこを隠蔽するツールがlibtoolやautoconf。
つまり、アプリの多プラットフォーム対応の際の、面倒な部分のみを抽出した問題。この問題を解く作業こそが、libtoolやautomakeの移植作業というもの。

面倒な問題だけを一ヶ所にあつめて、問題を解こうとしてるのだから、困難なのは当然だろ。

逆に、抽出した困難さが、もしも簡単に解ける程度であれば(簡単にlibtoolを移植できたのであれば)、
それはもともと、切り分けるに値しないほど簡単な問題だったということになる。
2012/02/21(火) 00:24:37.56
なんで、システムライブラリ、ヘッダーをconfigureの度にスキャンするんだ?
バカ丸出しのシステムだろ。

dllのリンクのために何行のツール作ってるんだ?
リンクのために5行以上の記述が必要なシステムなんか見たことないぞ。
2012/02/21(火) 00:31:39.51
まあ色々なプラットフォームでのビルドをサポートするためのツールだし。
あとキャッシュを消さなければ毎回スキャンはしないかも。
2012/02/21(火) 00:46:44.25
>>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で実行環境情報を積極的に得るようにすれば、プログラム最適化の幅が広がるはず。
2012/02/21(火) 01:02:28.82
thx!!
2012/02/21(火) 01:10:16.32
ちなみにCMakeはもっとスゴイぞ!
2012/02/21(火) 01:26:53.76
>>353
要するに、コア2のプロセッサをコア4のプロセッサへ換装しても、
それをautoconfが自動認識してくれるから便利ってこと?
2012/02/21(火) 01:31:38.51
バカなautotools

checking ...

これが世界中でどれだけ行われてるんだ? その電力で何人のアフリカの子供が…

システムライブラリなんか一回スキャンしてデータベース作ればOK。
考えた奴死ね。
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秒で終わるわ。
2012/02/21(火) 01:41:05.56
もうちょっとましな指摘は書けないのかよw
2012/02/21(火) 02:55:02.78
>>357
おまい頭良いな
2012/02/21(火) 07:59:40.53
アフリカの子供が不幸なのはアフリカの大人がDQNだからだよ
日本で言えば、赤ん坊を車に放置してパチンコ台の前に陣取る親みたいなものだ
2012/02/21(火) 09:06:59.31
>>357
話はそんな簡単じゃないみたいだぞ。

例えばソフトをビルドするときにある関数が期待した振る舞い(フレーバー)で利用可能
かどうか、はシステムライブラリにそれがあるかだけでは決まらない(例えばコンパイラ
のオプション等)ので。
2012/02/21(火) 09:17:44.19
>>362
configureが検出したものをオプションと一緒に記録しておけばいいんじゃない?
コンパイルオプションで挙動が変わる関数くらい数えられる程度では?
若しくは、そういった特殊な挙動を要求するものだけはDBを使わないようにすればいい
configureごとに全く同じ処理をキャッシュできればそれだけで随分速くなる
2012/02/21(火) 09:41:37.47
オプションに利用可能性が依存するって、どの規格(c90, c99, ...)を使うかくらい。
その以外で振る舞いや有無が変わる関数なんて使ってられんわ。使う価値ないね。

もしあるなら、そんなクズな関数を捨てれば何人の餓えているアフリカの子供が…
2012/02/21(火) 10:15:13.00
過度の汎用性を求めて(といっても所詮Unix限定だけど)汚い設定ファイル地獄
便利さも体感できないって、なんだか一昔前のJava + J2SE + メタフレームワーク地獄
みたい
m4とXMLの違いがあるけどね
今更m4なんて弄りたがるの変態ぐらいでしょ

それはそうと、.laや.pcにフルパス埋め込まれるのは何で?
あれrelocateしにくいから嫌なんだけど
.aや.soにはそんなもん埋め込まれないのに
2012/02/21(火) 10:35:54.54
>>364
きみがパソコンすてればアフリカの・・・
2012/02/21(火) 11:12:28.96
さすがに古臭い感じはする。
こんだけ広まっちゃうと今さらどうこうするのは難しいだろうけど。
2012/02/21(火) 13:39:46.81
>>363 >>364
いや、コンパイラのオプションでかなり変わるっしょ。
そういうので苦労したことない?

簡単に思いつくのでも、マクロ定義でいろんな挙動が変わりうるし、
ヘッダーやライブラリをどういう順序/場所で検索するかが変わったり、
生成するコードやハードウェア依存の機能を使うかが違ったり。

で、コンパイラのオプションはソフト毎に違うし、オプション同士は独立でもないし、
グローバルなconfigのキャッシュをうまく管理するのは自明じゃないと思うのだが。
2012/02/21(火) 15:03:36.68
>>361
サムエル・ワンジルさんの事件の真相なんか見ると
まったく仰る通りとしか思えない
http://bl og.liv edo or.jp/dom esaka/archives/1337215.html
2012/02/21(火) 17:40:15.55
>>368
何を心配しているか分からないが、それを調べるためのツールがautoconfだろ?
例えそっちが言うように得られる結果が複雑になっても、それは調べた結果だ

難しく考え過ぎているようだけど、ようは>>353みたいに「CPUの数はいくつ?」という問いとその答えを
キャッシュしておけば速くなるって話で、全く同じオプションで挙動が変わることがないなら、そうした心配はないはずだ
2012/02/21(火) 18:15:57.69
>>368
規格に関するオプション以外であるなら実例だせば議論が進むぞ。
「ある」だけ連呼すんなよ。

それが人間が管理できる以上の組み合わせならautoconfは意味があるわけだし、
数個なら意味なしという事だ。
2012/02/22(水) 06:42:18.85
>>370 >>371
話が通じてないならいいよ。
2012/02/22(水) 09:59:24.55
> いや、コンパイラのオプションでかなり変わるっしょ。
つまり、これの実例は挙げられないという事だね。

> 話が通じてないならいいよ。
捨て台詞がみっとも茄子。
2012/02/22(水) 15:20:49.78
いい加減にして
2012/02/23(木) 18:46:17.26
雲丹板って人減ってます?
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
というバージョン番号を振ってしまう。
2012/02/23(木) 19:57:38.09
>>375
2ch全体が絶滅危惧種
378デフォルトの名無しさん
垢版 |
2012/02/24(金) 10:00:26.97
非同期シグナルセーフなprintf誰か作ってー
2012/02/24(金) 10:17:07.20
そういえば、memcpyは非同期シグナルセーフじゃ無いんだな
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してなくても、たまたま自分自身が開いた
エフェメラルポートにも接続できちゃうみたいです。
感覚的には間違った動作に思えますが、そういう仕様なのでしょうか。
2012/02/24(金) 17:17:37.05
TCPの接続は<src IP, src port, dst IP, dst port>の四つ組で識別できる。
たまたま1と3、2と4が一緒でも特に支障はない。
プロトコル状態遷移の表の作り方によっては禁止もできるが。
2012/02/24(金) 17:33:05.37
お前ウソついてない? listenしてないのにconnectできちゃうの?
pythonのsocketは知らんけど、勝手にlistenする?

> from socket import *
> s = socket()
> s.bind(('', 5656))
> s.connect(('localhost', 5656))
2012/02/24(金) 17:55:14.86
>>382
>>380がどういうことかはよくわかってないけれど、一般論として、

pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。

それからTCPの接続を確立するには、accept()しなくてもよくて、
両側からconnect()してもOKです。

どっちもよく間違う人がいるんだけれども。
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");
}
2012/02/24(金) 20:03:31.13
カマー本とかスティーブンス本とか、
ソケットプログラミング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を使うような時って、
エフェメラルポートを受信ポートに使うのって危険?
予期せず自分自身のソケットに接続してしまうかもしれない。
まあ、どっちかと言うと先にポートが使われてて開けられなかった、とかの方がありそうですけどね。
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/
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になるのに別の手段が存在するということでしょうか?
2012/02/25(土) 12:34:32.23
一応ネットワークプログラミングスレで聞いた方がよさそうだと言っとく
http://toro.2ch.net/test/read.cgi/tech/1293284816/
390380
垢版 |
2012/02/26(日) 03:18:54.63
>>387
>>389
そうですね。ちょっと調べた後、そっちのスレで質問してみます。
皆さんありがとうございました。
2012/03/10(土) 20:50:36.82
単純なネタで恐縮ですが、errnoは並列化プログラミングに対して安全なのでしょうか?
主要な並列化手法の実装だけでもかまわないので、ご存知の方はコメントください。

また、チェック対象となるシステムコールやライブラリ関数の直前にいちいちerrno=0を
置くのはいまいちいけていない気がするのですが、もっとかっこいい方法はないですか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況