UNIXプログラミング質 ..
[2ch|▼Menu]
613:デフォルトの名無しさん
05/03/20 04:06:01
>>610
> #define SIZE 536870912

これって二進で100000000000000000000000000000、30bitじゃん。

幾らなんでもでかいだろ。
そのカーネルはユーザ空間どれくらいとれるの?
詳しいところ調べるの無理だったら、UNIX板のFreeBSD質問スレが良いかも。

614:デフォルトの名無しさん
05/03/20 06:18:36
問題は>>613>>612が指摘している点もあるが、それ以前に、
第一引数が 0 なのに MAP_FIXED を指定している点もある。
0番値から連続で512MBも置き換えたら、現在実行している
プログラムからなにから全部置き換えになるから、そりゃ
コアダンプもするだろ。

それから、flags には、必ず MAP_PRIVATE か MAP_SHARED
のどらかか片方は指定するようにしろ。

あと、>>612 が言うように、システムコールがエラーで返って
ないか調べて、エラーだったら perror() なりerr() する習慣
をつけろ。基本中の基本。

これだけ短いプログラムに、なんでこんなにたくさんバグを
入れられるのかが謎だ。もっと人の書いたちゃんとしたプログラム
を読んで真似する習慣をつけるべき。


615:デフォルトの名無しさん
05/03/20 06:57:39
どっかのクズサンプルをつかまされたのだろうきっと

616:デフォルトの名無しさん
05/03/20 10:47:37
バグと言っていいかどうか微妙だなw

617:610
05/03/20 11:46:33
>>612
あ、SIZEはtypoです。実際は両方ともsizeを指定してます。
あと、エラーチェックもperrorを実際は入れてます。
長くなると迷惑かと思って省略してしまいました、ごめんなさい。

>>613
その辺をうまくよきに計らってくれるのがmmapだと認識してたのですが・・・
間違いでしたか。

>>614
flagsにMAP_PRIVATEを入れたら行けました。
何か勘違いしてるみたいなのでもちっとじっくりmanを読んでみます。
ありがとうございました。

618:デフォルトの名無しさん
05/03/20 12:35:43
仮想メモリ空間が足りないのに良きに計らうもクソも無いだろ

619:デフォルトの名無しさん
05/03/20 13:37:38
>>613
>>610 ではないだが
> 30bitじゃん。
> 幾らなんでもでかいだろ。
なんで?
ふつうに,
mmap(0, 1024L*1024L*1024L, ...)
って, 使えてるが.
FreeBSD でも Solaris でも IRIX でも...
CPU アーキテクチャにもよるだろうけど, 32bit あれば
2G のユーザ空間確保できるのが普通じゃねぇの.


620:デフォルトの名無しさん
05/03/20 13:42:05
>>619
> CPU アーキテクチャにもよるだろうけど, 32bit あれば
> 2G のユーザ空間確保できるのが普通じゃねぇの.

なことはない。

621:デフォルトの名無しさん
05/03/20 13:47:05
>>620
> なことはない。
だから, なぜだか教えてほしいって言ってるじゃん.
backing store に指定容量以上ののファイルとか,
十分な量の swap 持ってきてもだめなの?


622:デフォルトの名無しさん
05/03/20 13:55:44
よくあるケースは、
・32bitアドレス空間を、半分カーネル空間
・ユーザ空間の半分をテキスト領域
・残りをスタック領域とデータ領域
・sparseであることを仮定したmmap設計
などなど

x86はセグメントありますから、32bit全部データ領域は可能。

623:デフォルトの名無しさん
05/03/20 14:02:45
UNIX userはやたらとalphabetで書きたがるね。

624:デフォルトの名無しさん
05/03/20 14:04:35
それが UNIXer quality

625:621
05/03/20 14:08:40
>>622
> よくあるケースは、
> ・32bitアドレス空間を、半分カーネル空間
mips あたりだと CPU が, そうゆう設計ですよね.

> ・ユーザ空間の半分をテキスト領域
こんなのって本当にある? バイナリの仕様次第か?
FreeBSD とか, 昔の SunOS-4 なんかだと
2^32/2 - text+maxdsiz+maxssiz が,
mmap で使用可能な空間ですよね?

> ・sparseであることを仮定したmmap設計
> などなど
64bit ならまだしも 32bit でやるかなぁ???

> x86はセグメントありますから、32bit全部データ領域は可能。
トロくなりませんか, OS が?


626:621
05/03/20 14:11:15
> mmap で使用可能な空間ですよね?
ごめんなさい,
mmap(NULL, ..., /*MAP_FIXED ではない*/)
の話.


627:デフォルトの名無しさん
05/03/20 15:58:01
そもそもmmap自体がポータブルじゃないので
良きに計らえとか言ってると火傷します

628:デフォルトの名無しさん
05/03/20 16:38:42
Windows使うのが安全。

629:デフォルトの名無しさん
05/03/20 17:10:23
同意。
わざわざ面倒なことする必要もない。

630:デフォルトの名無しさん
05/03/20 17:13:25
FreeBSD/i386 を含め、386BSD から派生した OS は
i386 上だと、VM_MAXUSER_ADDRESS=3G くらいだから
512MB くらいなら mmap できることが多いよ。
KVM を広げるようにカーネルを config してたり、
他にいろいろ mmap してたりすると 別だし、
0番値から MAP_FIXED で mmap してたらまずいけど。
>>617 は MAP_PRIVATE を入れただけじゃなくて、
MAP_FIXED は取り除いたんじゃないかな。

m68k 用 NetBSD は、カーネルとユーザ空間に別の
仮想空間を使っているので、ユーザ空間だけで 4GB
使えたり。

ユーザー空間が 4GB/2=2GB って OS は多いけど、
text に 2GB/2=1GB も割り当てるなんてもったいない
ことしてる OS はないと思う。text は、実行ファイル
に含まれている分しか確保されない。むしろ、
ヒープと stack の中間に shared library 用の mmap
領域があったりすることが問題。

631:デフォルトの名無しさん
05/03/20 17:13:47
>>627
mmap は、いまや POSIX.1:2004 に含まれているので、
そこそこポータブルですが、なにか?
Linux や *BSD など、POSIX.1:2004 をフル実装して
ない OS でも、mmap に関しては、ほぼ POSIX.1:2004
の仕様を満たしているよ。もっとも、定義されている
のは、各 OS の最大公約数程度の機能だけど。

632:デフォルトの名無しさん
05/03/20 17:15:24
>>628
Windows のメモリマップドファイルって、ローカル
ファイルシステムはマップできるけど、リモートに
ある奴は駄目という不便な仕様だった記憶があるけど
今では直ったの?
UNIX の場合、当然そんな制限はありません。

633:デフォルトの名無しさん
05/03/20 17:28:28
>>631
POSIXに含まれている=ポータブルではない。
「そこそこポータブル」って何だよ。

> mmap に関しては、ほぼ POSIX.1:2004 の仕様を満たしているよ。
本当に?A LinuxとB LinuxとC LinuxとD LinuxとFreeBSDで使えても
ポータブルとは言わないよ?

634:デフォルトの名無しさん
05/03/20 17:32:10
わははは!
ペイントハウスで思いのままだ!

635:デフォルトの名無しさん
05/03/20 17:37:57
>>633
> 本当に?A LinuxとB LinuxとC LinuxとD LinuxとFreeBSDで使えても
> ポータブルとは言わないよ?

で、君は使えない処理系の一つでも挙げればいいんだけど、自分は何も知らないけど煽ってるだけと言うことでいいの ?

636:デフォルトの名無しさん
05/03/20 17:46:23
>>633
POSIX.1:2004に書いてある仕様なら、Solaris, IRIX, Tru64, HP-UX,
AIX は使ってないので知らんが。これで現在でもメンテされている
商用UNIXはほぼ全部。ちなみにこの程度の範囲の仕様なら、いにしえ
の SunOS4 でも通用する。
mmap はシステムコールなので、別に A Linux, B Linux なんて
言わなくても全部の Linux で同じ動作だし、あの範囲の仕様な
ら、実際に Linux でも通用する。FreeBSD に限らず、全ての
4.4BSD 派生 OS でも通用する。

最初にまともな実装が登場した SunOS4 の時代ならともかく、
あれから 15年も経った今でもポータブルでないっていうのは
時代遅れだと思う。

637:636
05/03/20 17:48:22
編集してたら文章が欠けた…

> POSIX.1:2004に書いてある仕様なら、Solaris, IRIX, Tru64, HP-UX,
> AIX は使ってないので知らんが。

POSIX.1:2004に書いてある仕様なら、Solaris, IRIX, Tru64, HP-UX は
少なくとも満たしている。AIX は使ってないので知らんが。


638:デフォルトの名無しさん
05/03/20 18:21:48
611の言ったとおり、やっぱり商用UNIXじゃないとな。

639:デフォルトの名無しさん
05/03/20 18:32:28
>>638
だったらAIX以外ならOKよ。
AIXは、mmapは大丈夫かもしれんが、そもそもOSが変態だから
やめた方がいいかもしれん。

640:デフォルトの名無しさん
05/03/20 18:34:24
> A LinuxとB LinuxとC LinuxとD Linux
ワロタ

641:デフォルトの名無しさん
05/03/20 18:45:28
ここで質問すると、かならず無駄に互換性の話まで拡大するのな。
大抵の質問者が環境書かないからだと思うけど、
今回は環境かいても無駄だった。

642:デフォルトの名無しさん
05/03/20 18:55:20
で、件のFreeBSDでは動くのかというと、正確な所は誰も知らないと言う・・

643:デフォルトの名無しさん
05/03/20 18:58:03
POSIX.1:2004 の範囲ならFreeBSDでも動くよ?
元々の610のプログラムはバグバグなので、どのOSでも動かん。


644:デフォルトの名無しさん
05/03/20 19:13:13
たぶんWindowsなら動くんだよ。

645:デフォルトの名無しさん
05/03/21 02:25:57
特定のUNIXモドキ、しかも商用UNIXじゃないんだから
正確なところが分からなくても仕方ないと思う

646:デフォルトの名無しさん
05/03/21 03:22:59
basename()が引数の指す先を変更することってあるんですか?

647:デフォルトの名無しさん
2005/03/21 03:49:09(月)
>>610
どこの本やサンプルを見たらあんなコードになるのか興味深い
駆逐したいのでどこを参考にしたのか教えて欲しい。

648:デフォルトの名無しさん
05/03/21 09:16:03
>>646
URLリンク(www.linux.or.jp)
>path の内容を変更することがある。
だそうだ。

649:デフォルトの名無しさん
05/03/21 09:43:42
ちゃんと嫁

650:デフォルトの名無しさん
05/03/21 11:50:10
>>648
どちらかに決まってないんじゃ、呼び出した後free()すべきか
どうかどうやって決めればいいんでしょう?

651:デフォルトの名無しさん
05/03/21 12:21:58
free() ?
自分が確保したものは自分で free() するのが基本。
strdup() みたいに、ライブラリ内で確保するやつもいるけど、そういうやつはマニュアルに書いてある。

652:デフォルトの名無しさん
05/03/21 12:35:46
>>650
> dirname および basename は、静的に割り当てられたメモリへのポインタを
> 返すことがあり、これらの領域は後の関数呼び出しで上書きされるかもしれない。
…の部分に対する疑問?

それなら、

char * path = "foo/bar";
char * path_dup = strdup(path_dup);

char * path_dir = dirname(path_dup);

して、

free(path_dup);

すればいいだけだと思うが。

path_dup = dirname(path_dup);

みたいにすると、path_dup が strdup で確保したメモリじゃない可能性があるから、
free() するべきかどうか分からなくなるがね。


653:デフォルトの名無しさん
05/03/21 13:07:56
>>651
gethostbyname(3)なんかは、「*で返すのはstatic dataだべ」って書いてある。

URLリンク(www.opengroup.org)
のAPPLICATION USAGE



654:デフォルトの名無しさん
05/03/21 13:09:13
>>652
> char * path = "foo/bar";
> char * path_dup = strdup(path_dup);
>
> char * path_dir = dirname(path_dup);

ここでpath_dirの指す先がpath_dupの中かもしれないので

> free(path_dup);

ここでfree()してしまうとpath_dirが使えなくなりませんか?
何かすごくおかしいことを言っているのだろうか・・・

655:デフォルトの名無しさん
05/03/21 13:12:18
>>654
おまえ読解力ゼロ

656:デフォルトの名無しさん
05/03/21 13:26:42
>>654
付け加えると、path_dirは必要ならすぐに自前の領域にコピーしておくこと。
∵basename()を再度呼び出すと上書きされるから。

657:デフォルトの名無しさん
05/03/21 14:02:44
>>652
> char * path_dup = strdup(path_dup);
< char * path_dup = strdup(dup);

通りすがりに、取り合えず訂正しておくわ


658:デフォルトの名無しさん
05/03/21 14:03:51
>>657
m9(^Д^)プギャー

659:デフォルトの名無しさん
05/03/21 14:05:50
>>657
< char * path_dup = strdup(path);

間違えたわ…ハズ

660:デフォルトの名無しさん
05/03/21 18:31:51
>>652
「静的に割り当てられたメモリ」ってのはライブラリがstaticに持ってるバッファだと
言ってるように読めるんだが(バッファじゃないがerrnoみたいな)。
であるとすれば、free()するとおかしなことになるよな。
>>651が言ってるのはそういうことじゃないの?

661:デフォルトの名無しさん
05/03/21 18:34:51
strdup1つでここまで引きずるとは、さすがUNIX

662:デフォルトの名無しさん
05/03/21 18:42:03
>>660
だから basename の返り値を free しなきゃいいわけで、
basename に与えたポインタを free するのは問題ないだろ?

663:デフォルトの名無しさん
05/03/21 18:58:49
ここは小学生の溜まり場かよ。

664:デフォルトの名無しさん
05/03/23 02:23:26
>>660が正しい。POSIX仕様であっても、basename()は
引数で与えられた領域を上書きすることはない。だから、
上書きされることを気にしてstrdup()する必要もない。

どうもglibc-2.2.1までのPOSIXバージョンは、POSIXの
解釈を間違えていて上書きしてたことがあったようだが。
これはglibc特有のバグで、glibcを使ってなければ関係
ない。>>648の和訳のバグセクションは、そのあたりが
誤訳っぽいな。glibc-2.2.1より後でも問題があるように
読めてしまう。英語マニュアルを見れば明らかなんだが。

665:デフォルトの名無しさん
05/03/23 05:35:24
>>664
POSIXはどうかしらないけど、FreeBSD5.3だと
char * basename(const char *path);
って定義になってるから、引数のバッファは変更されることはなさそうね。
ついでに、返り値は「a pointer to internal static storage space」を返すとなってる。

>>652にあてはめるならこんな感じか。
char * path = "foo/bar";
char * path_dir = strdup(dirname(path));
/* ここでpath_dirを利用 */
free(path_dir);


666:デフォルトの名無しさん
05/03/25 14:31:04
666 ∈(・◎・)∋ 666


667:デフォルトの名無しさん
05/03/26 14:48:43
要するに、basename(3)使うときに、strdupもfreeも要らないわけだ

668:デフォルトの名無しさん
05/03/26 19:16:44
(゚Д゚)ハァ?

669:デフォルトの名無しさん
05/03/27 02:54:15
>>667
うん。ただし、basename(3)を複数回呼んで、その返り値を
後でまとめて使うような場合はmalloc(3)が必要となる。


670:デフォルトの名無しさん
05/03/27 11:34:39
別に固定バッファでもいいわけだが。

671:デフォルトの名無しさん
05/03/29 17:59:02
一つのプログラムファイルからしか使わない構造体があったとして
それをヘッダファイルではなく、foo.cの中で宣言定義するのってのは、
スタイル的に問題ないのでしょうか?

672:デフォルトの名無しさん
05/03/29 18:00:46
ここで質問する事が問題

673:デフォルトの名無しさん
05/03/29 18:36:19
>>672
BSDのソースではあまりみかけないのに、Linuxでは沢山あるので

674:デフォルトの名無しさん
05/03/29 20:13:11
漏れは、他のファイルに見せる必要の無いものは、
実際に見えないようにすべき、と考えます。

unixとは全然関係ないけどね。

675:デフォルトの名無しさん
05/03/29 20:23:30
させたいことと出来ることを一致させるのは大切ですね

676:デフォルトの名無しさん
05/03/30 16:22:54
>>674
俺も ノシ


677:デフォルトの名無しさん
05/03/31 15:18:49
suse9.1上でcを使って、ファイルサイズの取得方法を教えてください


678:デフォルトの名無しさん
05/03/31 15:21:08
>>677
stat()


679:デフォルトの名無しさん
05/04/02 23:47:35
hcreate()ってプログラムの中でひとつのハッシュ表しか使えないんですか?
だとしてこれは役に立つことがあるんでしょうか?

680:デフォルトの名無しさん
05/04/03 01:03:52
そりゃあるでしょ。
複数使いたければ、hcreate_r()使いなよ。

681:デフォルトの名無しさん
05/04/05 01:13:50
hcreate() なんてシラナンダ。自作してた…。

hcreate_r() は GNU 拡張か。


682:デフォルトの名無しさん
05/04/05 01:50:35
>>681
プラットフォームによってはバグってたりするから使わない方がいいよ
追加できるエントリ数にこっそり上限があったり

683:デフォルトの名無しさん
05/04/05 10:51:56
program_a が program_b を呼び出すようにしています.
gdb で program_b の動作をデバッグするには
どうすればいいのでしょう?


684:デフォルトの名無しさん
05/04/05 11:15:04
>>683
program_b の最初の辺りに sleep なり, 入力待ちなりを入れといて,
ps | grep program_b して gdb <pid-of-program_b> する.
どっちかってゆうと, ウニ板のくだ質ネタだが...


685:デフォルトの名無しさん
05/04/05 12:09:45
>>683
"program_b arg1 arg2"

"gdbserver localhost:20000 program_b arg1 arg2"

$ gdb
gdb> target remote localhost:20000
gdb> break xxx
gdb> continue

686:デフォルトの名無しさん
05/04/05 21:37:03
Windowsみたいにcch埋め込みして自動でデバッガ起動とかできないの?

687:デフォルトの名無しさん
05/04/05 21:47:46
core吐いたら、そこからデバッグを再開出来る気もする

688:デフォルトの名無しさん
05/04/06 00:02:56
>>686
こんな感じでいいのか?
以下を実行すると、自身を対象にgdbのウィンドウが立ち上がる。
char pidbuf[20];
snprintf(pidbuf, sizeof pidbuf, "%d", getpid());
if (fork() == 0)
   execlp("xterm", "xterm", "-e", "gdb", argv[0], pidbuf, NULL);
sleep(5); /* wait for gdb */
かなーりいい加減な実装だけど。


689:デフォルトの名無しさん
05/04/06 10:45:22
Unixプログラミングを詳しく
網羅した質の高いサイトを
この俺に教えてください

690:デフォルトの名無しさん
05/04/06 11:05:39
URLリンク(www.adl.nii.ac.jp)

691:デフォルトの名無しさん
05/04/06 15:24:06
CSVをパースするライブラリくれ
書くのめんどい

つーか、どう考えても世の中に大量にあるだろそんな汎用ライブラリ
どうしてgoogleで引っかからないんだこれ
だれかの陰謀か? 宇宙人?

692:デフォルトの名無しさん
05/04/06 15:26:47
>>691
perl >>>>>>>>>>>>>>>>>>>> ruby
URLリンク(search.cpan.org)

693:デフォルトの名無しさん
05/04/06 16:41:41
> perl >>>>>>>>>>>>>>>>>>>> ruby
> URLリンク(search.cpan.org)

まぬけですね

694:デフォルトの名無しさん
05/04/06 17:24:05
> > perl >>>>>>>>>>>>>>>>>>>> ruby
> > URLリンク(search.cpan.org)
>
> まぬけですね

まぬけですね

695:デフォルトの名無しさん
05/04/06 17:36:22
Cでくれ

696:デフォルトの名無しさん
05/04/06 17:52:29
一発動かすだけみたいなやつなら perl で十分だろうし、
そうでないなら...

> 691 名前:デフォルトの名無しさん[] 投稿日:2005/04/06(水) 15:24:06
> CSVをパースするライブラリくれ

> 695 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/06(水) 17:36:22
> Cでくれ

この間になんぼでも書けるだろう。

697:デフォルトの名無しさん
05/04/06 18:28:29
C--  (C Decre)

698:デフォルトの名無しさん
05/04/06 21:04:08
>>691
何故みつからないかというと、みんなが納得する"CSV"という
名前のフォーマットは存在しないからです
標準化されていない悲しさよ

699:デフォルトの名無しさん
05/04/06 21:24:12
そんなことなかろう。
google で
"comma separated value" parse library
を検索すると見つかるぞ。
単に探し方が悪いだけだと見た。


700:デフォルトの名無しさん
05/04/06 23:00:19
CSVって、
・フィールド,で区切られている。
・#から改行までは無視。
・,#をデータに入れたい時は、"tell your #, please!"とクォート。
・レコードは改行で区切られている。
が典型的かな。

>>698
色々と問題が起きそうなのは、
・改行コード。
・ISO-2022-JPの様な左面の文字集合切り替えのある場合。
かな。


701:デフォルトの名無しさん
05/04/06 23:08:41
>>700
> ・,#をデータに入れたい時は、"tell your #, please!"とクォート。
マジかよ
そんなエスケープ初めて聞いた

702:デフォルトの名無しさん
05/04/07 09:11:15
CSV

・1行で1レコード。
・コンマ「,」をデリミタとして値を区切る。
・値にコンマが含まれているときにはダブルクォート「”」で括る。
・値にダブルクォートが含まれているときは「””」と2重にする。


多少の方言はあるけど、だいたいこんなんが基本。
というのが漏れの理解。

703:デフォルトの名無しさん
05/04/07 09:41:22
値に「"」が含まれていたら「''」でクォートとか、「\」でエスケープとか、
文字列フィールドに数字しかないときは「'」が先行するとか、
微妙にいやらしい方言が多いんだよね。

704:デフォルトの名無しさん
05/04/07 10:12:33
だからライブラリが無いw

705:デフォルトの名無しさん
05/04/07 12:35:08
""の中に改行が含まれるケースもある

1,"abc","def",ghi,1111
2,"abc","This is a quoted
string.",def,234
3,"abc
def","hoghoge",aaa,234

みたいな

706:デフォルトの名無しさん
05/04/07 14:22:07
>>705
lex 辺りでアナライザーはかせりゃ, 悩むほどのもんじゃねぇだろ?
あとは, yylex 呼ぶループ書くだけ.


707:デフォルトの名無しさん
05/04/07 14:30:47
この程度、lex 使わずに手書きしても全然たいしたことない。
この程度が書けないような香具師は、Cを使うのはやめて、
Java とか Perl とか Python とか Ruby とか VB に転向すべき。

708:デフォルトの名無しさん
05/04/07 14:32:23
Perl なら
URLリンク(www.din.or.jp)
PHP なら
URLリンク(jp.php.net)
があるけどね

709:デフォルトの名無しさん
05/04/07 15:00:15
メールサーバでReceived:の項にJSTなどとタイムゾーンが文字で入りますが、あれは取得できる物なのでしょうか?
それとも、メールサーバのプログラムの中にそのようなテーブルがあるのでしょうか?

710:デフォルトの名無しさん
05/04/07 15:02:40
>>707
> この程度、lex 使わずに手書きしても全然たいしたことない。
ゴリゴリ手書きして遅いルーチンを書くのはいとも簡単だけど、
(f)lexと同等かそれ以上に高速なものにしようとすると結構大変かも。


711:デフォルトの名無しさん
05/04/07 15:04:59
>>709
echo $TZ

712:デフォルトの名無しさん
05/04/07 15:06:37
echo OTZ

713:デフォルトの名無しさん
05/04/07 15:36:01
>>710
トークンの種類が非常に多く、DFAのメリットが効いてくる
ような場合なら、確かに (f)lexの方が速くなるが、この例
だと共通プレフィックスになるような文字列は全くないので、
まともなプログラマが書けば、どう転んでも手書きの方が速い。
もちろん、まともじゃないプログラマなら話は全然別。

714:デフォルトの名無しさん
05/04/07 16:01:55
>>713
へっ?字句解析でDFAの表引きが効率向上に役立つ割合なんてほんの僅かです
が。字句解析器生成が手書きよりもうれしいのは、まず第一にバッファリング
(と先読み管理)をそれなりにきちんとやってくれるからですけど。もちろんき
ちんと最適化したマニュアルの解析器の方がバッファリングも速いけど、それ
はそれで「どう転んでも」速くなるほど自明じゃない。


715:デフォルトの名無しさん
05/04/07 16:12:37
うーん、ほとんどの言語は、そもそもそんな高度な
バッファリングなんていらないでしょ? 一文字バッ
ファリング、すなわち ungetc() で十分なことが
多いと思うけど。そりゃたまには、そうじゃない
変態文法もあるけどさあ。
今回の CSV も ungetc() で十分なので、バッファ
リングで遅くなる要素は、まったくないと思うけど?

716:デフォルトの名無しさん
05/04/07 18:08:46
おまいらは読込速度が問題になる程
大量の CSV を読もうとしてるのか…ッ!

こないだいたけどね。
「いやー Excel で開けないくらいでっかくなっちゃいましたよハッハッハ」
とかいうから、行数カウントしてみたら 1200万行。

717:デフォルトの名無しさん
05/04/07 18:54:46
そこまで多くなったらDB使えと小一時間(ry

718:デフォルトの名無しさん
05/04/07 20:36:51
CSVやめてS式にしようぜ

719:デフォルトの名無しさん
05/04/07 21:00:27
字句解析器がバッファリングをするって何の話だよ??

720:デフォルトの名無しさん
05/04/07 21:21:46
UNIXプログラミングに関係ないはなししはよそでおねがいします。

721:デフォルトの名無しさん
05/04/07 21:53:30
XMLに決まってんジャンww

722:デフォルトの名無しさん
05/04/08 00:09:41
LALRのLAじゃないの?>バッファリング

723:デフォルトの名無しさん
05/04/08 00:40:39
LALR使ってるのはlexじゃなくてyaccでそ。

724:デフォルトの名無しさん
05/04/08 01:39:56
Unix でプログラミングなら, あるもの使えば?
車輪の再発明の必要もないし...
ってな, つもりで >>706 を書いたんだが, 妙なことになってるしorz

>>720
> UNIXプログラミングに関係ないはなししはよそでおねがいします。
おもいっきり, UNIXプログラミングの*はなしし*だと思うが...
つか, UNIXプログラミングの*はなしし*をすれば, この程度は普通
だと思うぞ.


725:デフォルトの名無しさん
05/04/08 03:10:14
>>720 はCSVがUNIXに関係ないと思ってる香具師


726:デフォルトの名無しさん
05/04/08 03:38:49
>>709
fURLリンク(elsie.nci.nih.gov)

727:デフォルトの名無しさん
05/04/08 03:39:31
>>709
URLリンク(david.tribble.com)

728:デフォルトの名無しさん
05/04/08 09:32:37
>>725
関係無いだろ

729:デフォルトの名無しさん
05/04/08 11:46:01
yacc/lexがなきゃCSV も読めないのか、ここの連中は(笑)
火炎放射器でタバコに火を付けるってのはこういうのを言うのかね。

730:691
05/04/08 13:46:41
そういうのを自分で作るのが面倒だという話なんだ
誰かが作ったものがそこらに転がってるなら
火炎放射器でもなんでも使うよ。

731:デフォルトの名無しさん
05/04/08 14:42:40
cut(1) ですむところを awk や perl でやったりもするけど別にええやん

732:デフォルトの名無しさん
05/04/08 14:50:36
awkは兎も角、perlは…
まぁいいか。

>>730
火炎放射器使うくらいなら私は自分で火を熾すよ。

733:デフォルトの名無しさん
05/04/08 14:58:36
>>732
> 火炎放射器使うくらいなら私は自分で火を熾すよ。
野蛮だなw

734:デフォルトの名無しさん
05/04/08 15:14:19
火炎放射器を使う方がむしろ野蛮だと思いまつ。
つうか、これぐらい単純な処理だと、lex使う方
がむしろ面倒だと思う。

735:デフォルトの名無しさん
05/04/08 15:50:40
簡潔な方法が正解かと

736:デフォルトの名無しさん
05/04/08 16:11:18
simple is beauty が UNIX

737:デフォルトの名無しさん
05/04/08 18:39:06
なんだよお前らそんなに車輪作りたいのか?
おれはやだぜ

738:デフォルトの名無しさん
05/04/08 18:50:53
任意個の整数の合計を求めるライブラリくれ
書くのめんどい

つーか、どう考えても世の中に大量にあるだろそんな汎用ライブラリ
どうしてgoogleで引っかからないんだこれ
だれかの陰謀か? 宇宙人?


739:デフォルトの名無しさん
05/04/08 18:55:42
そんなのライブラるまでもないからだろ

740:部外者でけどね
05/04/08 19:24:44
こんなのは setjump / longjump のいい練習になるかな。遊びでつくてみよ。

741:デフォルトの名無しさん
05/04/08 19:32:59
>>740
整数の合計を求めるのにsetjump/longjump?

>>739, >>738
std::accumulate()

742:デフォルトの名無しさん
05/04/08 19:39:11
Cでくれ

743:デフォルトの名無しさん
05/04/08 20:18:25
>>738=740はただの初心者

744:デフォルトの名無しさん
05/04/08 20:23:22
#define goukei(arr) { int i; extern int g_goukei; for(i=0, g_goukei; i<sizeof(arr)/sizeof(arr[0]); i++) g_goukei+=arr[i]; }

745:デフォルトの名無しさん
05/04/08 20:27:16
UNIXでまともな言語ってJavaぐらいしかない

746:デフォルトの名無しさん
05/04/08 23:34:30
はつみみです

747:デフォルトの名無しさん
05/04/10 18:06:28
>>737
自分の回りに車輪が見当たらなければ作るしかねーだろが。

748:エラー処理ブッチご容赦
05/04/10 23:57:43
>>740
#include <setjmp.h>
#include <stdio.h>

void acc1(int n, int x, jmp_buf env) {
  if (n == 0) { longjmp(env, x); }
  else { acc1(n - 1, n + x, env); }
}

int acc(int n) {
  jmp_buf env; int x;
  if (n == 0) { return 0;}
  else if (x = setjmp(env)) { return x; }
  else { acc1(n, 0, env); }
}

int main(int argc, char *argv[]) {
  printf("%d\n", acc(atoi(argv[1])));
}


749:デフォルトの名無しさん
05/04/11 08:01:46
誰か、>748が何をしたいのか教えてくれ。

750:デフォルトの名無しさん
05/04/11 08:30:25
>>749
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv) {
printf("%d\n", atoi(argv[1]) * (atoi(argv[1]) + 1) / 2);
return 0;
}


751:デフォルトの名無しさん
05/04/11 09:27:35
やあおまいら。C言語の勉強ははかどってるかね?

752:デフォルトの名無しさん
05/04/11 09:39:22
>>750
それのどこが「任意個の整数の合計」なんだか。
つーか、>740=>748が阿呆なだけか。

753:仕様書無しさん
05/04/19 00:40:02
>>740
setjmp 使ってなくてすまん。

int
summers (int n, ...)
{
 va_list ap;
 int i = 0, sum = 0;

 va_start (ap, n);
 while (i++ < n)
  sum += va_arg (ap, int);
 va_end (ap);

 return sum;
}


754:デフォルトの名無しさん
05/04/19 20:26:29
だめだよぉ
setjmp使わなきゃ

755:デフォルトの名無しさん
05/04/21 15:45:47
Linux です.
ある実行ファイルを実行している最中で,
このファイルを open することはできますか?


756:デフォルトの名無しさん
05/04/21 15:48:58
>>755
自分で試せ。

757:デフォルトの名無しさん
05/04/21 15:50:00
>>755
こんにちはLinuxさん

758:デフォルトの名無しさん
05/04/21 15:50:17
>>755
このファイルとは、実行中の実行ファイルのことでしょうか。
それなら制限つきでopenできるはずです。

759:デフォルトの名無しさん
05/04/21 15:56:14
>>758
制限って?

760:755
05/04/21 16:13:06
説明が足りませんでした

ある実行可能ファイルを open したところ
失敗して,strerror(errno) したところ

Text file busy

とでるんです(バイナリファイルなのに…)

これはそのファイルが実行中と解釈していいのでしょうか?

761:デフォルトの名無しさん
05/04/21 16:38:39
>>760
LinuxさんはどんなUNIXを使ってらっしゃるんで?

762:デフォルトの名無しさん
05/04/21 17:05:16
書き込みモードで開こうとしてない?

あと text はコードというような意味。
バイナリファイル/テキストファイルというような区別はUnixにはない。

使用中なのは確かだけど実行中かどうかは知らん。

763:デフォルトの名無しさん
05/04/21 17:07:06
Text file busy どこで拾ってきたLinuxなんだろ

764:デフォルトの名無しさん
05/04/21 17:15:21
少なくとも BSD 系では errno 26 は "Text file busy."

765:755
05/04/21 17:18:53
いろいろどーもす
参考になりますた

> errno 26 は "Text file busy."

Linux でも同様です

766:758
05/04/21 18:28:40
>>759
既に答えが出ているからいいよね。
fopen("実行モジュール", "w");
とすると楽しいことになる。

767:デフォルトの名無しさん
05/04/21 20:41:01
>>766
そんなもん想定の範囲内だが?

768:デフォルトの名無しさん
05/04/21 20:47:43
楽しかった!
もっとやって!

769:デフォルトの名無しさん
05/04/21 23:40:28
Windowsのdllやexeは使用中に更新出来ないが
UNIXの実行ファイルは更新可能

770:デフォルトの名無しさん
05/04/21 23:43:56
実行中に削除って…なんか指令を伝えた後に爆発するレコードみたいだな

771:デフォルトの名無しさん
05/04/22 00:20:08
プロセス終了時にコア吐くですよ。

772:__
05/04/22 00:40:24
>>760
んー、こういうことかな?

#include <stdio.h>

int
main (int argc, char **argv)
{
 FILE *fp;

 if ((fp = fopen (argv[0], "w")) == NULL)
  perror ("fopen"), exit (1);

 fclose (fp);

 return 0;
}

$ gcc -Wall -o Text Text.c
$ ./Text
fopen: Text file busy
$

773:デフォルトの名無しさん
05/04/22 09:39:12
>>772
良い例です(笑)。細かな事ですが、コマンド名には大文字を入れないのが慣習です

774:デフォルトの名無しさん
05/04/22 11:36:45
select でパイプからの入力待ちをしたのですが
待ち時間を 10 秒とかにしているのに
すぐに 0 が返ってきます

時間切れ以外に 0 が返ってくる場合はありえるのでしょうか?

man select には時間切れと書いていますが

775:デフォルトの名無しさん
05/04/22 11:54:38
タイムアウトの指定の仕方が間違っている!(w

776:デフォルトの名無しさん
05/04/22 12:18:55
>>774
待ち時間の設定から呼び出しまで辺りのソースを晒して味噌。

777:デフォルトの名無しさん
05/04/22 20:23:18
会社のソースなので外部に持ち出せません
契約違反になります

778:デフォルトの名無しさん
05/04/22 20:26:26
バイバイ

779:__
05/04/22 20:54:02
>>777
へたれよのぅ。


780:デフォルトの名無しさん
05/04/23 05:05:53
それ以前にそんな奴が2chで質問するなと。


781:デフォルトの名無しさん
05/04/25 11:15:17
とあるプログラムをつくっていて

(1) Redhat 7.1
(2) Redhat EL WS

で動作が違いました.
すでに実行中のファイルを書きこみ専用で
open しようとしたときに
(1)では成功,(2)では失敗します.

このようなことはありえますでしょうか?
これは OS 自体の設定の違いによって起こるものなのでしょうか?

また,ファイルパスを指定して,
それが実行中かどうかを知る方法(もちプログラムの中で)は
ありますか?


782:デフォルトの名無しさん
05/04/25 11:54:35
その辺はLinux板だなあ。UNIX一般の問題じゃないから。

execve(2)した時の、O_EXEC, MAP_DENYWRITE関係の設定が変ったんだろ。
書けるとsecurity holeになるからね。十分あり得る。

$ cat /proc/プロセスID/maps

してみてね。



783:デフォルトの名無しさん
05/04/25 12:42:32
>>782
本当にそうなら、これでまたひとつWindowsに近づいたな。

784:781
05/04/25 12:48:45
失礼しますた
Linux 板にいてきます

785:782
05/04/25 12:55:58
>>783
遠退いたんでしょ?

786:デフォルトの名無しさん
05/04/29 16:02:44
サーバのプログラムはアイドル時どのように、待っているのでしょうか?
sleepを入れながらポーリングするのでしょうか?


787:デフォルトの名無しさん
05/04/29 16:06:08
何するものかによって違うけど、普通は select とかだろうね。

788:デフォルトの名無しさん
05/04/29 16:09:48
>>786
ポーリングでしか分からないのなら、それもあり。
でも定期的に無駄にCPU使うので、可能なら
accept なり、read なりでイベント待ちするのが普通


789:デフォルトの名無しさん
05/05/01 10:11:26
Linuxでのプログラミング学習です。
こんな問題をいきなり授業で出題されました。
まだほとんど何もやってないので、さっぱり
意味が分かりません。分かる方がいらっしゃるなら、
回答の方教えてはいただけませんか?



f(x)=xの2乗-xy-yの2乗 について
x=-0.423 y=1 の時の値を(小数点第4位までの表示)
で求めなさい。ただし、変数x,yの値はscanf文で
入力させてください。


790:デフォルトの名無しさん
05/05/01 10:15:54
アナタとワタシはスレ違い。

791:デフォルトの名無しさん
05/05/01 10:20:48
GTK プログラミング!!
で聞けばいいんですかね?

792:デフォルトの名無しさん
05/05/01 10:37:11
>>789
perl -e '$x=scanf();$y=scanf();printf "%.4f\n",$x**2-$x*$y-$y**2;sub scanf {<>}'

793:デフォルトの名無しさん
05/05/01 11:20:35
>>789
お好きなところへどうぞ。
スレリンク(tech板)
スレリンク(tech板)

794:デフォルトの名無しさん
05/05/01 12:11:43
ありがとうございました

795:从*・ 。.・) ◆SayuminPM.
05/05/01 21:46:42
Advanced Programming in the UNIX(R) Environment (2nd Edition)
URLリンク(www.amazon.com)

みんな予約した?

796:デフォルトの名無しさん
05/05/01 22:50:17
そんな消え行く過去の遺産の本はもういらん
第1版で十分

797:デフォルトの名無しさん
05/05/01 23:19:31
”そんな消え行く過去の遺産の” と "はもういらん"
は不必要

798:デフォルトの名無しさん
05/05/01 23:38:03
今住んでいるところで現物見れそうもないんで、
とりあえずレビューされてから考えようかな、と。
第1版は持ってるし。エラッタ修正待ちも兼ねて。


799:デフォルトの名無しさん
05/05/01 23:42:31
>>797

第1版で十分

800:デフォルトの名無しさん
05/05/02 00:07:33
$ cat >>799 | grep "で" | awk -F'版|十' '{ print $2"?" }'

801:デフォルトの名無しさん
05/05/02 00:26:02
ワロタ

802:デフォルトの名無しさん
05/05/02 00:45:05
>>800
>799は>797の指示に従ったんだろ。

803:デフォルトの名無しさん
05/05/02 00:54:40
>>798
×エラッタ
○イレイタ
○エラータ

804:デフォルトの名無しさん
05/05/02 03:53:51
もはやカタカナ表記はエラッタでいいんじゃないの?
UNIXをユニックスと書くやつはいてもユーニクスとは誰も書かないのと同じで。

803は現代日本で生きるのは大変そうだな。
明治時代なら好きな読みを押し付けられたのに。



805:デフォルトの名無しさん
05/05/02 03:59:28
>>804はアイロンとか使えないんだよ。

806:デフォルトの名無しさん
05/05/02 04:20:02
急速にスレの質が低下してまいりました

807:デフォルトの名無しさん
05/05/02 19:52:24
いや、最初からこんな感じだったよ

808:デフォルトの名無しさん
05/05/02 19:56:03
バケラッタ

809:デフォルトの名無しさん
05/05/04 16:07:05
c++(gcc)での実行ファイル名(つまり自分自身のファイル名)の取得方法を教えてください


810:デフォルトの名無しさん
05/05/04 16:07:46
argv[0]

811:デフォルトの名無しさん
05/05/04 16:12:01
このスレにあったような。

812:デフォルトの名無しさん
05/05/05 23:01:54
質問です。

fork/execして生まれた子が親の死を感知する方法で一般的な
方法はあるのでしょうか?(initに引き取られると困る)

調べると「システムによってはSIGHUPが...」とかという記述で
一般的な方法は見つかりませんでした。

もちろん、「そんな親プログラムを作るな」というのは承知しているのですが...


813:デフォルトの名無しさん
05/05/05 23:17:20
ないんじゃないでしょうか。
どうしても知りたければお爺さんプロセスから教えてもらうようにするとか。
ちなみにSIGHUPは親プロセスの死とは直接関係ないですよ。



814:デフォルトの名無しさん
05/05/05 23:38:01
ncursesを使ったソースでなるべくシンプルなものってないでしょうか
お手本にしたいのですが

815:デフォルトの名無しさん
05/05/05 23:43:53
$ cd ncurses-5.4/test
$ ls
Makefile.in README aclocal.m4 background.c blue.c
bs.6 bs.c cardfile.c cardfile.dat color_set.c
configure* configure.in demo_defkey.c demo_forms.c demo_keyok.c
demo_menus.c demo_panels.c ditto.c dots.c edit_field.c
edit_field.h filter.c firework.c firstlast.c gdc.6
gdc.c hanoi.c hashtest.c ins_wide.c inserts.c
keynames.c knight.c listused.sh* lrtest.c modules
ncurses.c ncurses_tst.hin newdemo.c railroad.c rain.c
tclock.c test.priv.h testaddch.c testcurs.c testscanw.c
tracemunch* view.c worm.c xmas.c


816:デフォルトの名無しさん
05/05/06 00:17:10
>>812
親のみが書き手、子が読み手のpipeを用意する。
親が死んだら子によるread(2)の返り値が0になるはず。

とか。一般的かどうかは知らない。

817:812
05/05/06 00:35:30
>>813
>>816
レスありがとうございます。やはり一般的な方法はないですか・・・
パイプとかPID監視とかの代替案を使うことにします。

818:デフォルトの名無しさん
05/05/06 01:09:12
>>812
> (initに引き取られると困る)

ここが引っ掛かっていてスルーしていたんだけど、
これどういう意味なの? 何が困るの?

pollingでいいなら、IPCのセマフォ使うとか。

819:デフォルトの名無しさん
05/05/06 01:17:25
URLリンク(p231.net220148094.tnc.ne.jp)
wwwwwwっwwwwwwっうぇwwwwwwwwwwww
wwwうぇwwwうはっwwwっ
おkwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwww

820:デフォルトの名無しさん
05/05/06 03:26:12
>>812
kqueue/keventがあるOSなら任意のpidのexitしたのがわかる。

821:デフォルトの名無しさん
05/05/06 06:08:03
>>812
適当にシグナル投げてみるとかは?

822:デフォルトの名無しさん
05/05/06 06:24:26
>>821
能動的にアクション起こしていいんなら getppid()!=1 で十分だろう

823:デフォルトの名無しさん
05/05/07 02:48:42
wchar_t wb[] = L"ほげ";
printf("%S",wb);

wchar_t wb[20];
initscr();
getn_wstr(wb, 20);
printw("%S",wb);
は問題なし
wchar_t wb[] = L"ほげ";
initscr();
printw("%S",wb);

^[$B$[$2^[(B
こんな風に表示されてしまう
setlocale(LC_ALL, "");してみても変化無し
何が足りないんでしょう


824:デフォルトの名無しさん
05/05/07 03:05:39
シェルで日本語出すように設定してないだけじゃねーの?

825:デフォルトの名無しさん
05/05/07 07:14:54
出力はISO-2022-JPに見える。
ターミナルのlocaleはそれでいいのか?

826:デフォルトの名無しさん
05/05/07 18:29:50
>>822
getppidなんてはじめて知った
おくがふかいなぁ

827:デフォルトの名無しさん
05/05/10 07:09:50
プロセス間でデータをやりとりするにはどうしたらよいのでしょうか?
WindowsにおけるWM_COPYDATAのような方法を探しているのですが。

828:デフォルトの名無しさん
05/05/10 08:35:35
親子、あるいは親戚関係にあればpipe(2)、
そうでなければmmap(2)、IPC共有メモリなど。

829:デフォルトの名無しさん
05/05/10 16:03:44
Xwindowで動作するプログラムを作りたいのですが、どこから勉強していけばよいのでしょうか?
C++でコマンドラインプログラムは書けます。

830:デフォルトの名無しさん
05/05/10 17:30:24
今さらXlibでもあるまいから、まずは使うGUIツールキットを決めなされ。
多分GTK+かQtのどちらかになると思うけど。決まったらそのスレへgo!


831:デフォルトの名無しさん
05/05/10 20:00:24
widestudio とかもあるよ

832:デフォルトの名無しさん
05/05/10 20:02:45
最近良く見かけるが、WideStudio の中の人は 2ch で宣伝する方針なのか?

833:デフォルトの名無しさん
05/05/10 20:26:28
Motifを忘れているよ。
UNIXなら標準だし、ついでにXlibにも詳しくなる。

834:デフォルトの名無しさん
05/05/10 20:30:23
いつのまに標準になってたのか

835:デフォルトの名無しさん
05/05/10 20:46:32
Motifはどさ回りの仕事量が増えるけどねぇ。
ツールキットとしては古くて資料も色々あるけど。
それにしても、関数名が長いし。
#XmToggleButtonGadgetGetState()とかw

836:デフォルトの名無しさん
05/05/10 20:59:48
>>833
>ついでにXlibにも詳しくなる。
詳しくないと使えないっつーか
だから避けられるんだっつーか

…折れ線グラフひとつ書くのも一苦労でしたよ、ええ。

837:デフォルトの名無しさん
05/05/11 00:27:26
C++だからQtかgtk--のどちらかだろう。
俺としてはmoc拡張の必要のないgtk--を推奨。

URLリンク(www.geocities.com)
↑を眺めてみるのもよし

838:デフォルトの名無しさん
05/05/12 23:46:19
おれならまずXでGUIアプリなんて作らないな

839:デフォルトの名無しさん
05/05/14 03:01:37
あるプロセスIDのプログラムが実行中かそれとももう終了したのかを確認するにはどうしたらよいのでしょうか?

840:デフォルトの名無しさん
05/05/14 03:31:32
詳解Unixプログラミングを読むのが一番早い。

841:デフォルトの名無しさん
05/05/14 04:19:01
それくらいならFAQにも出てたと思う。


842:839
05/05/14 04:48:27
/procディレクトリの中のPIDと同じファイルが存在すれば、実行中であると判断しても問題ないでしょうか?
実行が終了すれば必ず消えるものなのでしょうか?

843:デフォルトの名無しさん
05/05/14 06:18:25
kill 839


844:デフォルトの名無しさん
05/05/14 06:20:14
>>839
kill(pid, 0)

845:デフォルトの名無しさん
05/05/14 06:20:43
間違えた。

kill(839, 0)



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

5397日前に更新/215 KB
担当:undef