[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 09:49 / Filesize : 207 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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/

952 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 18:06:38 ]
別にsyslogdの動作が標準で決まっているわけじゃないので、
SIGHUP送ればどうとかそんなことは環境依存。少なくとも最近の
OSに同梱のsyslogdなら、ローテートするためのコマンドが一緒に
ついてくるか、ローテートする方法がマニュアルに書いてある
はずだが。
どっちも無いとしたらそのロクでもない環境を恨め。

953 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 18:14:01 ]
syslog(3)はsyslogdにログを送る関数で、
ログローテイトはsyslogd側の仕事。

殆んどの場合、SIGHUPでsyslogdがログファイルをreopenする。
ただし、新しいファイルはtouch(1)などで作成してやる必要があることが多い。

>>945>>946は、かなり無知だから、知らないことは黙っているように。

954 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 18:37:40 ]
SIGPIPEってシグナルハンドラで捉えることができないのでしょう
か?

下のプログラムを実行してもシグナルハンドラが呼ばれず、一瞬で
終了してしまいます。linuxとsolarisでテストしてみました。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void f(int a)
{
  printf("sigpipe\n");
}

int main(int argc, char **argv)
{
  int fds[2];
  pipe(fds);
  close(fds[0]);
  write(fds[1], "hoge", 4);
  signal(SIGPIPE, f);
  sleep(100);
  return 0;
}

955 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 18:44:24 ]
>>953
syslogがsyslogdにログを送る関数なんて決まってないんだが
LinuxとBSDしか触ってないとこういう人間になるんだろうか

956 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 19:00:45 ]
>>953
ちょっと誤解を招きそうな書き方じゃないか?
syslogdはHUPを受けてクチをパクパクするだけで
ログローテート自体はnewsyslog(ないし類似品)の仕事。

どのみちsyslogを吐くプログラムの知ったことではないんだが。

>>954
KILLとSTOP以外は捕捉できる筈だが。他のttyでkillを使ってSIGPIPEを
送ってみたか?
言っておくが、writeより後に設定したシグナルハンドラが時空を遡って
機能するなんてことはないぞ普通。

>>955
質問からsyslogdが存在するシステムなのは明らかなんだから別に構わないだろ。
この質問でimplementation-defined logging facilityがsyslogd以外であることを
想定する奴はいないだろ。


957 名前:954 mailto:sage [2005/09/19(月) 19:47:06 ]
>>956
すいません。あほでした。writeを後にしたらシグナルハンドラが
呼ばれました。

958 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 19:53:54 ]
>>954
$ cat tt.c
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void f(int a)
{
fprintf(stderr, "sigpipe\n");
fflush(stderr);
}

int main(int argc, char **argv)
{
signal(SIGPIPE, f);
for (;;) {
printf("This is a test\n");
fflush(stdout);
}
return 0;
}
$ ./a.out | echo
sigpipe
sigpipe
sigpipe

959 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 17:39:45 ]
fork、ドキュメント呼んでも全然わかりません
小さいプログラムのソースと挙動から都合のいい解釈してます
でダメだししてほしいんですけども

intforked = -1;
int main() {
fork();
}

int fork() {
if (forked == -1)
forked = 0;
return (forked = main());
} else {
return (forked);
}
}

この自作forkはforkっぽいですか?全然話になりません?

960 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 17:44:22 ]
>>959
なにがやりたいの?




961 名前:デフォルトの名無しさん mailto:sage [2005/09/20(火) 18:11:49 ]
>>959
pthreadあたりと混同してるね

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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<207KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef