- 1 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 13:14:50 ]
- UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド
前スレ Part5 pc8.2ch.net/test/read.cgi/tech/1105723117/ Part4 pc5.2ch.net/test/read.cgi/tech/1095843584/ Part3 pc5.2ch.net/test/read.cgi/tech/1085930894/ Part2 pc5.2ch.net/test/read.cgi/tech/1055110889/ Part1 pc2.2ch.net/tech/kako/992/992057422.html Part3のミラー makimo.to/2ch/pc5_tech/1085/1085930894.html Part2のミラー makimo.to/2ch/pc5_tech/1055/1055110889.html 関連スレ Cygwin使っている人いますか? その14 (UNIX板) pc8.2ch.net/test/read.cgi/unix/1107587275/ Cygwin使っている人いますか? 3 (Windows板) pc8.2ch.net/test/read.cgi/win/1090131123/ 関連板 pc8.2ch.net/unix/ pc8.2ch.net/linux/
- 962 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 18:16:53 ]
- 自前で fork できたら大変w
- 963 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 18:22:44 ]
- >960
やりたい事はとりあえず理解したいです あれであってます?forkがpidだけ違う複製(子)を生成します。て各所で書かれてますが forkは己を呼ぶって事ですよね?どこを呼ぶんんでしょうか、もーまるごと疑問ですよ 根本が間違ってると思うんで質問しづらいんですけども switch(fork()) { case 0: exec(); } こんなコードとか見かけるんですけど forkしてからexec()呼んだりするのは 何のメリットがあるんでしょうか 普通にexec()呼ぶコード見かけません
- 964 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 18:51:25 ]
- fork() は現在のプロセスと同じ内容の新しいプロセスを生成する。
exec() は現在のプロセスに別のプログラムをロードして実行する。 fork() してから exec() すれば、現在のプロセスはそのまま実行しつつ、 新しいプロセスで別のプログラムを実行することができる。 fork() しないで exec() すれば、現在のプログラムは別のプログラムに置き換わってしまう。
- 965 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 18:51:52 ]
- >>963
そのコードだと、fork()でプロセスがコピーされた後は 親プロセスも子プロセスもswitch()で真偽の評価を行う。 fork()の返り値は親と子で異なるから そのswitchによって親と子の動作が分岐する。 「普通にexec()呼ぶ」と1つのプロセスが他のプログラムに化けるだけ。 それに対してfork()してexec()呼ぶとマルチプロセスになる。
- 966 名前:965 mailto:sage [2005/09/20(火) 18:57:13 ]
- >>965
>親プロセスも子プロセスもswitch()で真偽の評価を行う。 ミスった。 「親プロセスも子プロセスもswitch()で値の評価を行う」が正しい。
- 967 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 19:54:03 ]
- fork()した瞬間を堺に、実行してるプロセスが二つに分裂する。
fork()した途端にパラレルワールドができると思え。 そのパラレルワールドは元の世界とまったく同じだが、 ひとつだけ、fork() の戻り値と、親の pid だけが違う。
- 968 名前:963 mailto:sage [2005/09/20(火) 20:21:53 ]
- >965,967
すっごい、今その事を頭にいれて読み直しました。で 親はforkの戻り値がおおー、 子のプロセスが再度同じfork通って、おおーー これ子もwait通っていいの?おおーすげーーーー とか自己完結の連発です。上手く言えません ぐっときましたありがとう。更に深めにのめり込んで見ます これ2重人格だ
- 969 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 20:27:51 ]
- ちょっと微笑ましいね
- 970 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 20:34:43 ]
- >>968
> 子のプロセスが再度同じfork通って、おおーー メモリの中身も全く同じ分身(子プロセス)が出来て、 そいつはfork()を返るところから始まるんですよ。 ただpidや帰り値が違うと。
- 971 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 04:54:25 ]
- でも実際、fork() のインターフェースは奇怪だよなぁ…。
なんかもっと上手い方法は無かったんかね。
- 972 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 04:58:57 ]
- いや、とてもよくできている。
*BSDのrfork()もpretty!
- 973 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 12:16:54 ]
- 漏れもとても使い勝手が良いとおもう>>fork
Windows の CreateProcess みたいな一見すっきりしたAPIだと、 新プロセスに情報を渡すのが面倒。
- 974 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 13:43:43 ]
- >>973
すっきりしてるかなあ? まあWin32のプロセスは親子の結び付きが弱いような気はしますな。
- 975 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 14:08:17 ]
- Win32は、
・コンセプト単純 ・関数仕様複雑 ・機能貧弱 POSIX fork()は、 ・コンセプト抽象的 ・関数仕様超単純 ・(モデルが)高機能 fork()に戸惑う人は、抽象的なコンセプトにやられていると思われ fork/joinモデルよりも、分身が出来るという概念に。
- 976 名前:デフォルトの名無しさん [2005/09/21(水) 17:12:14 ]
- Linux環境で、getopt()を使ってるプログラムをgdbでデバッグ
してるんだけど、いくらgetopt()してもoptindをprintコマンド で見るといつも1になってるんです。 コード中でprintf()してoptindを見ると、ちゃんと数字が上がる んだけど。 で、optindのポインタを調べてみたら、gdbでprintしたやつと コード中でprintf()したやつとは違った物になってた。 どうやったらgdbで正しいoptindを見ることが出来ますでしょうか。
- 977 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 20:04:01 ]
- 試さずに適当に答えるが、最適化されちゃってんじゃないのかな。
最適化外してコンパイルしてみればあ。
- 978 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 20:17:42 ]
- libcコンパイルしなおせばいいんだと思うが、そもそも板違い。犬板逝け
- 979 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 20:19:04 ]
- (´・ω・`)
- 980 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 21:13:30 ]
- fork()の仕様が単純とか言ってる奴は池沼ですか
- 981 名前:デフォルトの名無しさん mailto:sage [2005/09/21(水) 21:20:42 ]
- >>978
逆だろ? callerが、calleeによって変えられたメモリじゃなくて、 registerのみを見てるんだろ? (gdb) printf *(&optind) でどうかな?
- 982 名前:976 [2005/09/22(木) 10:15:47 ]
- 皆様ありがとうございます。
CPUに弱いのでcallerとかcalleeとか全くわからいのですが、 >>981さんの言う (gdb) print *(&optind) でも結局同じでした。 皆さんの環境ではどうなんでしょうか。ちゃんと正しい optind が gdb の print で見れているのでしょうか。 あと、犬板に相応のスレが無いのでここに来た次第です。
- 983 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 10:39:38 ]
- 試してみたけどこのぐらいの簡単なプログラムで確かにその現象がでるな。
#include <stdio.h> #include <unistd.h> extern int optind; int main(int argc, char **argv) { int opt; while ((opt = getopt(argc, argv, "abc")) >= 0) { printf("opt=%c optind=%d &optind=%08x\n", opt, optind, (int)&optind); } }
- 984 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 10:40:20 ]
- ↑をgdbにかけるとこんな感じ。
(gdb) break 9 Breakpoint 1 at 0x8048414: file optind.c, line 9. (gdb) run -a -b Starting program: /home/matsui/a.out -a -b Breakpoint 1, main (argc=3, argv=0xbfdd1884) at optind.c:9 9 while ((opt = getopt(argc, argv, "abc")) >= 0) { (gdb) s 10 printf("opt=%c optind=%d &optind=%08x\n", opt, optind, (int)&optind); (gdb) s opt=a optind=2 &optind=080496b8 9 while ((opt = getopt(argc, argv, "abc")) >= 0) { (gdb) print optind $1 = 1 (gdb) print &optind $2 = (int *) 0xb7fb07d8 どうなってんのかね?
- 985 名前:>>981 mailto:sage [2005/09/22(木) 11:03:22 ]
- (gdb) print *((int *) 0xb7fb07d8)
すると、正しい値だね。
- 986 名前:>>981 mailto:sage [2005/09/22(木) 11:07:49 ]
- lists.gnu.org/archive/html/bug-gdb/2005-07/msg00002.html
にも報告されてる。 6.0, 6.3でも駄目。
- 987 名前:デフォルトの名無しさん [2005/09/22(木) 15:34:09 ]
- pc8.2ch.net/test/read.cgi/tech/1114223450/
>GNUが低品質なのはconfigureと無関係ではないだろう。 >GNUが低品質なのはconfigureと無関係ではないだろう。 >GNUが低品質なのはconfigureと無関係ではないだろう。
- 988 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:42:27 ]
- GNUって究極の低賃金労働者の粗悪品だろ。
- 989 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:47:22 ]
- そもそもソース配布なんて馬鹿げた思想を排除すべき。
- 990 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:48:14 ]
- まさにこの業界にとっての諸悪の根源だね
- 991 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:50:44 ]
- GDBっつーかGNU謹製のクソさ加減がよくわかった
- 992 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:52:09 ]
- でも、糞UNIXがいまだに生き残ってるのはGNUのおかげなんだよな。
- 993 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:53:36 ]
- SourceForge死ね
- 994 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:56:02 ]
- 価値のあるソフトを作ってください
- 995 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:57:57 ]
- >>98
同意! RMSは反社会的な共産主義者!
- 996 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 15:58:34 ]
- 国にはGPLコードの輸入の禁止措置をとってもらいたい。
このままでは国内産業が壊滅してしまう。
- 997 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 16:00:13 ]
- おれもそう思う。
こういうソース公開の押し付けは、いらないんじゃないかって。
- 998 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 16:01:27 ]
- UNIX向けの商用のソフトが存在しないのは
こいつのせい
- 999 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 16:02:19 ]
- 存在しないオプションを渡した時のoptoptは正しく読めるな。
それから、gdbで、optind = 100としても、メモリ側は書き変わってないけれど、 (gdb) print optind すると、100が出力される。 やはり>>981ということで、メモリをフェッチせずにレジスタを見ているようだ。
- 1000 名前:デフォルトの名無しさん mailto:sage [2005/09/22(木) 16:02:19 ]
- 次スレ
pc8.2ch.net/test/read.cgi/tech/1114223450/
- 1001 名前:1001 [Over 1000 Thread]
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
|

|