UNIXプログラミング質 ..
[2ch|▼Menu]
822:デフォルトの名無しさん
05/09/03 13:49:04
>>812
サンクスコ

実行中でのウファルの振る舞いが完全理解できたよ

823:デフォルトの名無しさん
05/09/03 14:18:22
完全に理解(笑)

824:デフォルトの名無しさん
05/09/03 14:24:28
もはや(w)はなんとも思わなくなったけど、
逆に(笑)がけっこうムカツクことに気づいた。
時代は変わったということだな。

825:デフォルトの名無しさん
05/09/03 14:36:50
そういえばpsで見える実行ウファルのパスはどうやって調べてるんだ?
argv[0]なの?

826:デフォルトの名無しさん
05/09/03 14:38:43
>>817
そうは言うが、ではしつこく残ってるflockの存在意義って何よ?

827:デフォルトの名無しさん
05/09/03 14:41:58
>>826
backward compatiblityってやつじゃないの。

828:デフォルトの名無しさん
05/09/03 18:54:51
>>826
flock(2)は*BSDで独自の発展をとげているし、(4.2BSDの頃から仕様が変わっている)
POSIX等で標準化されてないから、OSを超えたポータビリティはないと思ってくれ。
ロックしたファイルをclose(2)したり、dup(2)したり、
プロセスが終了したり、fork(2)したり、execve(2)したりした時の振る舞い。

FreeBSDのマニュアルは、POSIX fcntl(2)のロックの意味を、
stupidと言っているが、標準であることの意味は大きい。
問題とされているところを、回避するような実装を行えばいいだけだから。
URLリンク(www.freebsd.org)

FreeBSDはflock(2)がefficientであると言っているから、
#ifdef FreeBSD
#error "....."
#endif
なソースでflock(2)するのは、いい場合もあるんじゃないかと思うが。

829:デフォルトの名無しさん
05/09/04 00:11:21
fcntlの振る舞いは本当にstupidだと思う

830:デフォルトの名無しさん
05/09/04 01:18:15
なにそのunix会話

831:デフォルトの名無しさん
05/09/04 08:41:32
flock()はBSD系で、lockf()/fcntl()はSysV系
両方使える人は好きなほう使えばいいじゃん。ってことっしょ

832:デフォルトの名無しさん
05/09/04 11:20:29
BSDって、もしかしてUNIXの足引っ張ってる?

833:デフォルトの名無しさん
05/09/04 12:20:24
はい

834:デフォルトの名無しさん
05/09/04 19:57:15
はいじゃないが

835:デフォルトの名無しさん
05/09/05 10:53:20
>>832
唯我独尊&孤立無援状態

836:デフォルトの名無しさん
05/09/05 15:07:32
自分自身のnice値の取得方法を教えてください

837:デフォルトの名無しさん
05/09/05 15:56:29
getrusage(RUSAGE_SELF, &ru)

838:デフォルトの名無しさん
05/09/06 07:00:57
URLリンク(www.linux.or.jp)
これを見てみたのですが、どれがnice値に相当するのでしょうか?よろしくお願いします。

839:デフォルトの名無しさん
05/09/06 07:30:26
人に教えれるほど知識無いけど
ググったらgetpriorityが見つかったけど違う?

840:デフォルトの名無しさん
05/09/06 08:35:10
>>837は間違い。
>>839は正しい。

841:デフォルトの名無しさん
05/09/06 18:36:04
調べしないででスミマセンが、ワードがまったく検討がつかないのでお願いします。。

普通Windowsアプリケーションは、
Win32APIやDirectXのAPI郡などのMSが提供している関数を用いて作ってるのですが。
主にFedoraCoreやVineではこれらと同じような、もしくは頑張れば表現可能なAPI郡は存在するのでしょうか?



842:デフォルトの名無しさん
05/09/06 18:39:24
てかすぐ出てきちゃいましたΛllΛ

Gtk+なるSDKがあるのですね、、
ちと勉強してきます

843:デフォルトの名無しさん
05/09/06 20:23:35
>>842

WindowsっていうOSは、ウィンドウシステムも含んでリリースされています。
でも、一般的にUNIX系のOSは、ウィンドウシステムは含まれていません。

使いたい人が使いたいウィンドウシステムを使えばいいという考え方です。
(とは言え、X以外のウィンドウシステムってあんまり聞きませんが。)

ゆえに、ウィンドウシステムに対するAPIも1つではなく、さまざまな種類が
存在しています。(XというウィンドウシステムのAPI:ツールキットも様々な
種類があります。)
Gtk+もその一つにすぎません。

と言うことを念頭においておかないと、せっかく覚えたのに、数年後には
だれもつかっていない過去の遺物となってしまうかも知れません。


844:デフォルトの名無しさん
05/09/06 20:37:07
GTK+はダメだよ
Xtを使うのが普通

845:デフォルトの名無しさん
05/09/06 21:03:19
gtk+で問題なし。ただ

> Win32APIやDirectXのAPI群

に相当するものではないけど。

846:デフォルトの名無しさん
05/09/06 21:21:33
>>821
X自体がセキュリティもアクセラレータもなんもない地雷環境なので、
世にある窓マネージャは例外なくスナップショットの画像で誤魔化してます。
Gtk+もその1つで、実際の動作を見るとその醜さに驚かされるでしょう。

>>844
UNIXでGUIなんてダメだよ
Windowsを使うのが普通

847:デフォルトの名無しさん
05/09/06 21:27:53
さくら、それを言っちゃあお仕舞いよ。

848:デフォルトの名無しさん
05/09/06 21:44:10
GNUStep最強

849:デフォルトの名無しさん
05/09/06 21:57:05
>>846
DRI じゃダメなのか?

850:デフォルトの名無しさん
05/09/06 21:58:29
>>846
> X自体がセキュリティもアクセラレータもなんもない地雷環境なので、

無知蒙昧だな。


851:デフォルトの名無しさん
05/09/06 22:25:24
そこでlg3dの出番ですよ。

852:デフォルトの名無しさん
05/09/06 22:39:55
Xのセキュリティはxhost, xauthがあるし、
アクセラレーションなら MIT SHM拡張があるし

853:デフォルトの名無しさん
05/09/06 22:46:51
xhostwwwwwwww


854:デフォルトの名無しさん
05/09/06 22:53:13
>>852
acceleration つったら普通は h/w acceleration じゃない?
↓ここが参考になるかも。

Xの描画が一番速いグラフィックカードってどれ?
スレリンク(linux板)

855:デフォルトの名無しさん
05/09/07 01:54:38
詳解UNIXプログラミングって本買ったんですけど、
C言語で組むのとどう違うのか、本質が理解できません。
目の覚めるようなご教授をお願いします。

なるほどー、というようなやつで。

856:デフォルトの名無しさん
05/09/07 02:00:03
Cしたい

857:デフォルトの名無しさん
05/09/07 02:09:51
>>855
おまえには無理

858:デフォルトの名無しさん
05/09/07 02:12:34
そういう受け答えは飽きたので、レスするのは本当の答えを知っている人だけで結構ですから。

859:デフォルトの名無しさん
05/09/07 02:15:09
質問の意味が理解できないからそんな人はいないかと(笑)

860:デフォルトの名無しさん
05/09/07 02:41:17
C言語云々は ANSI C のみでという事か?
自分の居場所を説明出来ないヤツに道案内するのはしんどいからパスだな。

861:マイク ◆yrBrqfF1Ew
05/09/07 02:41:37
ハードウェアは変更しづらいから
遅いけど変更しやすいソフトウェアがあるはずだが
そのソフトウェアに合わせてハードを選ぶのは本末転倒だよな?

862:デフォルトの名無しさん
05/09/07 03:38:01
>>855
違わないと何か困るの?

>>861
日本語不自由なんだね。ちゃんと勉強しないと高校行けないよ。

863:デフォルトの名無しさん
05/09/07 03:46:25
ファイルがすでに存在するかどうかを確認するにはどのようにしたらよいのでしょうか?

864:デフォルトの名無しさん
05/09/07 03:50:35
目視で確認すればいいだけじゃん

865:デフォルトの名無しさん
05/09/07 03:54:31
ワロタ

866:デフォルトの名無しさん
05/09/07 04:06:25
目視は疲れるからなあ。俺なら人に訊くね。

867:デフォルトの名無しさん
05/09/07 04:16:29
プログラムからコマンド例えばlsを発行してその結果をプログラムに取り込む方法を教えてくだすれ

868:マイク ◆yrBrqfF1Ew
05/09/07 04:26:50
よく知らんがパイプとか標準出力等をdupったりすんじゃないのか。

869:デフォルトの名無しさん
05/09/07 04:27:55
よくしらないのにレスするな

870:デフォルトの名無しさん
05/09/07 04:28:26
system とか popen とか

871:デフォルトの名無しさん
05/09/07 04:51:03
APUEをちゃんと嫁

872:デフォルトの名無しさん
05/09/07 04:58:20
open(2)してみれば分かる。
なければ、エラーか、新規作成かは第二引数で選ぶことができる。


873:デフォルトの名無しさん
05/09/07 11:46:11
>>867
よくしらんが、GUIならコピー&ペーストという手がある。

874:デフォルトの名無しさん
05/09/07 12:07:11
>>873
どんなプログラム書けばいいんですか?

875:デフォルトの名無しさん
05/09/07 12:11:53
teratermでログインすりゃログ取れるでしょ
それと同じようにすればいい

876:デフォルトの名無しさん
05/09/07 12:17:53
>>875
詳しく

877:デフォルトの名無しさん
05/09/07 12:38:00
結論:>>863 に見合った方法など ない

878:デフォルトの名無しさん
05/09/07 13:12:09
>>877
いや、>>872だから。

>>867は、>>870のpopen(3)。


879:デフォルトの名無しさん
05/09/07 13:44:51
UNIXはまともなファイラーがない時点でクライアントとして終わってる
emacs使ってるキモイ奴は困らないだろうけど
fdcloneの入ってない環境はクソ

880:デフォルトの名無しさん
05/09/07 13:45:57
>>879
ワラタ

881:デフォルトの名無しさん
05/09/07 13:47:03
emacs持ち出すまでもなく、お好きなシェルでええやん(笑)

882:デフォルトの名無しさん
05/09/07 13:52:20
>>881
おまえ、タイプ量考えろよ
おれはファイル選択はカーソルキー以外使いたくないの

883:デフォルトの名無しさん
05/09/07 13:57:23
UNIXは唯一telnetとかでリモート操作できるのは評価してやるが
GUIはクソ
コピペもまともにできないXサーバーなんて入れるかっつーの
おれはteratermで十分
けどCUIのファイラーがfdcloneしかないのはマジでクソ

884:デフォルトの名無しさん
05/09/07 13:58:47
>>883
ファイラって便利?

885:デフォルトの名無しさん
05/09/07 13:59:03
シェルはDOSよりずっとまともなワイルドカード使えるし
正規表現つかえるツールもいっぱいあるやん。
肌に合わないなら無理してUnix使うなよ(笑)

886:デフォルトの名無しさん
05/09/07 14:02:00
PIP.COMがないと話にならん。
今でも8インチ片単に入れて持ち歩いている。

887:デフォルトの名無しさん
05/09/07 14:03:39
海胆糞板逝け

888:デフォルトの名無しさん
05/09/07 14:06:09
うむ、PIPはけっこう良かった。

889:デフォルトの名無しさん
05/09/07 18:42:10
>>882
指の本数足りない人は大変だね

890:デフォルトの名無しさん
05/09/07 21:23:50
じゃぁ俺、秀吉。

891:デフォルトの名無しさん
05/09/07 21:35:07
>>890
大杉。

892:デフォルトの名無しさん
05/09/08 11:18:54
vimのようにスクリーン全体を書き変えるようなプログラムの画面出力を得るにはどうしたらよいのでしょうか?

893:デフォルトの名無しさん
05/09/08 11:52:01
vram上のデータをファイルに書きだせばいい。

894:デフォルトの名無しさん
05/09/08 11:55:49
>>892
・画面のイメージが欲しい。
・画面全体を文字列として取得したい。
・vimの出力するコントロールシーケンスを取得した。
どれ?

895:デフォルトの名無しさん
05/09/08 12:17:45
>>894
二番目か三番目です。そのへんも良くわからないもので…

896:デフォルトの名無しさん
05/09/08 12:20:00
>>894
> ・画面全体を文字列として取得したい。

端末エミュレータでcut&paste

> ・vimの出力するコントロールシーケンスを取得した。

script(1)


897:デフォルトの名無しさん
05/09/08 12:21:02
あれ? 自分の書いたプログラムで、
自分の書いた画面を知りたいと言うこと?
curses(3)を使って画面を書けばあ?

898:デフォルトの名無しさん
05/09/08 12:24:47
>>896
おお、ありがとうございます!scriptを使ってみます。

899:892=895=898
05/09/08 12:27:09
>>893
vramって何か分かりません…
>>897
自分の書いたプログラムから他のプログラムを呼びだして、その画面出力が得られないかと思ったのですが…。

900:デフォルトの名無しさん
05/09/08 12:30:59
>>899
scriptはそういう使い方じゃないなあ。
cursesの方が良さそう。>>687>>683


901:892
05/09/08 12:40:48
>>900
そうなんですか。。cursesで調べてみます。ありがとうございます!

902:デフォルトの名無しさん
05/09/08 13:13:26
>>901
騙されるなキミが調べるべきものは pty だ。

903:デフォルトの名無しさん
05/09/10 12:28:45
あるプロセスが動いているかどうかを調べるための関数を教えてください。

904:デフォルトの名無しさん
05/09/10 12:31:03
ps

905:デフォルトの名無しさん
05/09/10 12:57:56
>>903
URLリンク(www.adl.nii.ac.jp)

906:デフォルトの名無しさん
05/09/10 14:35:12
困りましたねぇ。

907:デフォルトの名無しさん
05/09/10 14:42:55
なんだこの直訳なページは!!

908:デフォルトの名無しさん
05/09/10 14:51:26
>>907
>>3

909:名無しさん@そうだ選挙に行こう
05/09/10 21:54:37
>>907
書籍じゃないんだから訳が気に入らないなら自分も訳せば?


910:名無しさん@そうだ選挙に行こう
05/09/10 22:45:09
メモリが'read'になることはできませんでした。

911:名無しさん
05/09/11 08:40:39
>>892
vim abc.txt |tee vim.log
でどう?

912:911
05/09/11 09:01:00
あるいは、vim のコマンドを使って適当な行を切り出す。
vim -c ":1,25w! onepage.txt" orig.txt


913:名無しさん@そうだ選挙に行こう
05/09/11 19:05:01
オクトデュアル ってなんでしょうか

914:名無しさん@そうだ選挙に行こう
05/09/11 19:10:03
ググったらすごかった

915:デフォルトの名無しさん
05/09/12 09:54:37
Emacsやviより統合開発環境を使った方がわかり易くないでしょうか?



916:デフォルトの名無しさん
05/09/12 09:58:27
Σ(´д`) えっ このすれは大学生、院生、趣味人 しかいないって本当ですか?

917:デフォルトの名無しさん
05/09/12 10:15:59
本当です

918:デフォルトの名無しさん
05/09/12 14:10:34
趣味人ってのが範囲広すぎるな。。。
(一応)社会人の俺もあてはまってしまうではないか。

919:デフォルトの名無しさん
05/09/12 14:18:35
社会人に(一応)と付ける意味がわからん。
NEETってこと?

920:デフォルトの名無しさん
05/09/12 15:04:12
>>913-
スレ違い

921:デフォルトの名無しさん
05/09/12 15:36:29
>>1-
板違い

922:名無しさん
05/09/16 19:59:21
Advanced Programming in the Unix Environment
だけど、
amazon.com から直接買うのと
amazon.co.jp から買うのとどっちが安い?

923:デフォルトの名無しさん
05/09/16 20:21:59
しらべりゃば?

924:名無しさん
05/09/16 20:52:18
調べた。
amazon.com(古本) + 送料9.79ドル + 日本の消費税 = 7848円  (3週間以上かかる?)
amazon.co.jp(新本) + 送料無料  +  (税込み)    = 8734円  (数日)

925:デフォルトの名無しさん
05/09/17 08:41:08
ついでに買いたい洋書の1冊や2冊ないのか?


926:名無しさん
05/09/17 13:26:08
古本混ぜると1パックにまとまらんのよ

927:デフォルトの名無しさん
05/09/17 13:46:49
自分なら値段が少し高くついても、面倒くさくないほうを選ぶ。

928:デフォルトの名無しさん
05/09/17 18:00:49
おまいら、MINIXやったか?

929:デフォルトの名無しさん
05/09/17 18:03:52
けっ、

930:名無しさん
05/09/17 20:19:39
Advanced Programming in the Unix Environment
第1版   著者Stevens(1999年に死去)       邦訳 『詳解UNIXプログラミング』
第2版   Pagoによる改定版(2005年)        (いずれ第2版の邦訳も出るだろう)

Linuxについての記述を読んでみたいので買うか。


931:デフォルトの名無しさん
05/09/17 23:59:20
カーネルの勉強したいけど、どのへんがおすすめ?
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)

932:デフォルトの名無しさん
05/09/18 08:01:52
FreeBSDじゃダメかね? OS問わないなら、一番読みやすいと思うが。
URLリンク(www.mckusick.com)
具体的なんじゃなくて、概論だったらこっちがお勧め。
URLリンク(www.amazon.com)

タンネンバウムはMINIX(とamoeba)で有名になったけれど、著作は激しくイマイチ。

933:デフォルトの名無しさん
05/09/18 12:16:16
今更FreeBSDのkernelなんか勉強して意味あるのか
LinuxかOpenSolarisだろ

934:デフォルトの名無しさん
05/09/18 12:50:49
Solarisだと、↓だな。

Solarisインターナル
URLリンク(www.amazon.co.jp)

935:デフォルトの名無しさん
05/09/18 12:52:00
>>933
基本的な技法はそれほど変わらないよ。
>>931のような人なら。

Linuxはいい本あるかね?
構造がころころ変わるしなあ。

936:デフォルトの名無しさん
05/09/18 15:34:39
kernel 2.4以前と2.6以降の違いって言えるか?

おれは、無理。

937:名無しさん
05/09/18 21:25:27
つ URLリンク(www-6.ibm.com)

938:デフォルトの名無しさん
05/09/18 21:28:20
↑ブラクラ

939:デフォルトの名無しさん
05/09/18 23:36:06
さすがにdeveloperWorksをブラクラって言っても誰も引っかからないと思う

940:デフォルトの名無しさん
05/09/19 11:43:21
おれはURLだけ張って澄まし顔の奴が許せない

941:デフォルトの名無しさん
05/09/19 13:04:58
なぐっていいよ

942:デフォルトの名無しさん
05/09/19 14:03:15
仕事上Linuxカーネルの仕様変更は0.0.0.1単位で把握してるけど
こういうのって御当地カップラーメンのバージョンいくつ覚えてるか
とかいうのと大差無いどうでもいい知識なんだよな。面白いけど。

943:デフォルトの名無しさん
05/09/19 15:19:54
ログファイルの再オープン(?)について質問です。

openlog("test", LOG_NDELAY|LOG_PID, 0, LOG_LOCAL2);
のようにオープンして出力しているログファイルを、SIGHUP受信時に
再オープンしたいのですが、
signal(SIGHUP,sighup_handler);
...
void sighup_handler(int signal)
{
closelog();
openlog("test", LOG_NDELAY|LOG_PID, 0, LOG_LOCAL2);
}

では、処理以降にログが記録されなくなってしまいました。
GoogleやKodersなどで調べてみてもこれというものが見つからなかったのですが
正しい処理の書き方はどのようにすればいいのでしょうか?

944:943
05/09/19 15:26:41
補足です。
最終的にログローテートを正常に行いたいわけですが、/etc/syslog.conf に
local2.*/var/log/test.log
とした上で、/etc/logrotate.d/syslog に
/var/log/test.log {
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

と書いたのですが、ローテート後のログファイルには何も出力されませんでした。
それでプログラム側でもSIGHUPで何かしないとだめなのかと思ったのですが。。。

945:デフォルトの名無しさん
05/09/19 15:48:34
>>943
やり方はだいたいOKだから
closelogとopenlogを疑うしかないな
openlog内のファイルの開き方が特に心配だ

946:デフォルトの名無しさん
05/09/19 16:00:27
経験的にはcloselog呼ばずにもう1回openlog()呼べば上手く行くことが多い

947:943
05/09/19 16:02:03
ありがとうございます。
openlog()で開いてsyslog()で出力しているだけなので、openlog()の処理が
実際どのように行われているか分かりません…。渡している引数がおかしかったり
するのでしょうか?

それと環境を書いていませんでした。RedHat9(gcc3.2.2, glibc2.3.2)です。
単純なサーバプログラムの練習で書いています。

948:943
05/09/19 16:24:38
>>946
ありがとうございます。
試してみましたが、ファイル名を変更しても以前のログファイルにそのまま
追記されてしまいました。

根本的な質問で恐縮ですが、syslogにログを出力する場合にログローテートに
必要なこととは何なのでしょうか?
・アプリケーション側でHUPシグナル受信時などにログファイルを再オープン
・syslogdを再起動
↑上記は二つとも必要でしょうか?

949:943
05/09/19 16:26:42
すみません。>>943のopenlog()の部分ですが手写しだったので
間違っていました。訂正いたします。
誤: openlog("test", LOG_NDELAY|LOG_PID, 0, LOG_LOCAL2);
正: openlog("test", LOG_NDELAY|LOG_PID, LOG_LOCAL2);

950:デフォルトの名無しさん
05/09/19 16:51:07
書かれるログはsyslogが握ってるんだから出力するデーモン側では
何もする必要ないだろ。
syslogdが腐ってるんじゃないの?
それになんでわざわざkillのエラー出力を捨ててるのさ。



951:943
05/09/19 18:00:21
ありがとうございます。
syslogに出力している場合、syslogdを再起動(またはHUP)するだけで
良いということですね。ローテート後にログが出力されなくなるのは別の
原因かもしれませんので、もう少し調べてみます。

killのエラー出力を捨てているのは、/etc/logrotate.d/syslog の他の
デフォルト記述がそうなっていたので流用していました。


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

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

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

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

954:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/09/19 18:44:24
>>953
syslogがsyslogdにログを送る関数なんて決まってないんだが
LinuxとBSDしか触ってないとこういう人間になるんだろうか

956:デフォルトの名無しさん
05/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
05/09/19 19:47:06
>>956
すいません。あほでした。writeを後にしたらシグナルハンドラが
呼ばれました。

958:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/09/20 17:44:22
>>959
なにがやりたいの?


961:デフォルトの名無しさん
05/09/20 18:11:49
>>959
pthreadあたりと混同してるね

962:デフォルトの名無しさん
05/09/20 18:16:53
自前で fork できたら大変w

963:デフォルトの名無しさん
05/09/20 18:22:44
>960
やりたい事はとりあえず理解したいです
あれであってます?forkがpidだけ違う複製(子)を生成します。て各所で書かれてますが
forkは己を呼ぶって事ですよね?どこを呼ぶんんでしょうか、もーまるごと疑問ですよ

根本が間違ってると思うんで質問しづらいんですけども
switch(fork()) {
case 0:
exec();
}
こんなコードとか見かけるんですけど
forkしてからexec()呼んだりするのは
何のメリットがあるんでしょうか

普通にexec()呼ぶコード見かけません


964:デフォルトの名無しさん
05/09/20 18:51:25
fork() は現在のプロセスと同じ内容の新しいプロセスを生成する。
exec() は現在のプロセスに別のプログラムをロードして実行する。

fork() してから exec() すれば、現在のプロセスはそのまま実行しつつ、
新しいプロセスで別のプログラムを実行することができる。

fork() しないで exec() すれば、現在のプログラムは別のプログラムに置き換わってしまう。


965:デフォルトの名無しさん
05/09/20 18:51:52
>>963
そのコードだと、fork()でプロセスがコピーされた後は
親プロセスも子プロセスもswitch()で真偽の評価を行う。
fork()の返り値は親と子で異なるから
そのswitchによって親と子の動作が分岐する。

「普通にexec()呼ぶ」と1つのプロセスが他のプログラムに化けるだけ。
それに対してfork()してexec()呼ぶとマルチプロセスになる。

966:965
05/09/20 18:57:13
>>965
>親プロセスも子プロセスもswitch()で真偽の評価を行う。

ミスった。
「親プロセスも子プロセスもswitch()で値の評価を行う」が正しい。

967:デフォルトの名無しさん
05/09/20 19:54:03
fork()した瞬間を堺に、実行してるプロセスが二つに分裂する。
fork()した途端にパラレルワールドができると思え。

そのパラレルワールドは元の世界とまったく同じだが、
ひとつだけ、fork() の戻り値と、親の pid だけが違う。

968:963
05/09/20 20:21:53
>965,967
すっごい、今その事を頭にいれて読み直しました。で

親はforkの戻り値がおおー、
子のプロセスが再度同じfork通って、おおーー
これ子もwait通っていいの?おおーすげーーーー

とか自己完結の連発です。上手く言えません
ぐっときましたありがとう。更に深めにのめり込んで見ます
これ2重人格だ

969:デフォルトの名無しさん
05/09/20 20:27:51
ちょっと微笑ましいね

970:デフォルトの名無しさん
05/09/20 20:34:43
>>968
> 子のプロセスが再度同じfork通って、おおーー

メモリの中身も全く同じ分身(子プロセス)が出来て、
そいつはfork()を返るところから始まるんですよ。

ただpidや帰り値が違うと。

971:デフォルトの名無しさん
05/09/21 04:54:25
でも実際、fork() のインターフェースは奇怪だよなぁ…。
なんかもっと上手い方法は無かったんかね。

972:デフォルトの名無しさん
05/09/21 04:58:57
いや、とてもよくできている。
*BSDのrfork()もpretty!

973:デフォルトの名無しさん
05/09/21 12:16:54
漏れもとても使い勝手が良いとおもう>>fork

Windows の CreateProcess みたいな一見すっきりしたAPIだと、
新プロセスに情報を渡すのが面倒。

974:デフォルトの名無しさん
05/09/21 13:43:43
>>973
すっきりしてるかなあ?
まあWin32のプロセスは親子の結び付きが弱いような気はしますな。


975:デフォルトの名無しさん
05/09/21 14:08:17
Win32は、
・コンセプト単純
・関数仕様複雑
・機能貧弱
POSIX fork()は、
・コンセプト抽象的
・関数仕様超単純
・(モデルが)高機能

fork()に戸惑う人は、抽象的なコンセプトにやられていると思われ
fork/joinモデルよりも、分身が出来るという概念に。

976:デフォルトの名無しさん
05/09/21 17:12:14
Linux環境で、getopt()を使ってるプログラムをgdbでデバッグ
してるんだけど、いくらgetopt()してもoptindをprintコマンド
で見るといつも1になってるんです。
コード中でprintf()してoptindを見ると、ちゃんと数字が上がる
んだけど。

で、optindのポインタを調べてみたら、gdbでprintしたやつと
コード中でprintf()したやつとは違った物になってた。

どうやったらgdbで正しいoptindを見ることが出来ますでしょうか。

977:デフォルトの名無しさん
05/09/21 20:04:01
試さずに適当に答えるが、最適化されちゃってんじゃないのかな。
最適化外してコンパイルしてみればあ。

978:デフォルトの名無しさん
05/09/21 20:17:42
libcコンパイルしなおせばいいんだと思うが、そもそも板違い。犬板逝け


979:デフォルトの名無しさん
05/09/21 20:19:04
(´・ω・`)

980:デフォルトの名無しさん
05/09/21 21:13:30
fork()の仕様が単純とか言ってる奴は池沼ですか

981:デフォルトの名無しさん
05/09/21 21:20:42
>>978
逆だろ? callerが、calleeによって変えられたメモリじゃなくて、
registerのみを見てるんだろ?

(gdb) printf *(&optind)
でどうかな?

982:976
05/09/22 10:15:47
皆様ありがとうございます。
CPUに弱いのでcallerとかcalleeとか全くわからいのですが、
>>981さんの言う

(gdb) print *(&optind)

でも結局同じでした。
皆さんの環境ではどうなんでしょうか。ちゃんと正しい optind
が gdb の print で見れているのでしょうか。

あと、犬板に相応のスレが無いのでここに来た次第です。


983:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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
05/09/22 11:03:22
(gdb) print *((int *) 0xb7fb07d8)

すると、正しい値だね。

986:>>981
05/09/22 11:07:49
URLリンク(lists.gnu.org)
にも報告されてる。

6.0, 6.3でも駄目。

987:デフォルトの名無しさん
05/09/22 15:34:09
スレリンク(tech板)

>GNUが低品質なのはconfigureと無関係ではないだろう。
>GNUが低品質なのはconfigureと無関係ではないだろう。
>GNUが低品質なのはconfigureと無関係ではないだろう。


988:デフォルトの名無しさん
05/09/22 15:42:27
GNUって究極の低賃金労働者の粗悪品だろ。

989:デフォルトの名無しさん
05/09/22 15:47:22
そもそもソース配布なんて馬鹿げた思想を排除すべき。


990:デフォルトの名無しさん
05/09/22 15:48:14
まさにこの業界にとっての諸悪の根源だね


991:デフォルトの名無しさん
05/09/22 15:50:44
GDBっつーかGNU謹製のクソさ加減がよくわかった

992:デフォルトの名無しさん
05/09/22 15:52:09
でも、糞UNIXがいまだに生き残ってるのはGNUのおかげなんだよな。

993:デフォルトの名無しさん
05/09/22 15:53:36
SourceForge死ね


994:デフォルトの名無しさん
05/09/22 15:56:02
価値のあるソフトを作ってください


995:デフォルトの名無しさん
05/09/22 15:57:57
>>98
同意!
RMSは反社会的な共産主義者!

996:デフォルトの名無しさん
05/09/22 15:58:34
国にはGPLコードの輸入の禁止措置をとってもらいたい。
このままでは国内産業が壊滅してしまう。

997:デフォルトの名無しさん
05/09/22 16:00:13
おれもそう思う。
こういうソース公開の押し付けは、いらないんじゃないかって。


998:デフォルトの名無しさん
05/09/22 16:01:27
UNIX向けの商用のソフトが存在しないのは
こいつのせい

999:デフォルトの名無しさん
05/09/22 16:02:19
存在しないオプションを渡した時のoptoptは正しく読めるな。

それから、gdbで、optind = 100としても、メモリ側は書き変わってないけれど、
(gdb) print optind
すると、100が出力される。

やはり>>981ということで、メモリをフェッチせずにレジスタを見ているようだ。


1000:デフォルトの名無しさん
05/09/22 16:02:19
次スレ
スレリンク(tech板)


1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5394日前に更新/207 KB
担当:undef