UNIXプログラミング質 ..
[2ch|▼Menu]
577:デフォルトの名無しさん
05/03/16 01:03:40


578:デフォルトの名無しさん
05/03/16 01:08:34
>>577
ネタもないのに書くなYO!

579:567
05/03/16 03:04:40
>>587
ソースコードが間違ってます。

冒頭で、

using namespace std;

とするか、std::coutとするのが今ん流儀です。

それ以外は処理系依存の動作。

って書こうと思っていたのにッ…orz


580:デフォルトの名無しさん
05/03/16 03:08:27
もうこのくらいでやめとこうや。
な?

581:デフォルトの名無しさん
05/03/16 04:20:47


582:デフォルトの名無しさん
05/03/16 11:16:00
age

583:デフォルトの名無しさん
05/03/17 16:47:56
gdb でデバッグするために
gcc で -g をつけてデバッグ情報つきの
オブジェクトファイルを作ってから
リンクしました.

ところができた実行ファイルを gdb しても
デバッグできません.
たとえば list しても

No symbol table is loaded. Use the "file" command.

とでます.

-g をつけるとたしかに .o ファイルはサイズが増えていますが,
最終的にリンクすると,できた実行ファイルは -g を
つけようとつけまいとなぜか変わらないんです.

なぜでしょうか?


584:デフォルトの名無しさん
05/03/17 16:53:20
リンクするときに-gをつけてないとか。


585:583
05/03/17 16:58:50
>>584
リンクするときに -g つけてもつけなくても結果は同じです

586:デフォルトの名無しさん
05/03/17 17:10:29
リンクするときに-sをつけているとか。


587:583
05/03/17 17:21:53
>>586
たしかにリンクに -s がついていて
これをはずすとデバッグできました
他人が書いたソースなもんで

man 見たところ -s に対する説明がありませんね
-S はありますが.
これはなんでしょうか?

588:デフォルトの名無しさん
05/03/17 17:34:29
少しは上の方を見ろよ。

589:429
05/03/17 20:46:23
>>587
> man 見たところ -s に対する説明がありませんね
% man ld
<snip>
-s
--strip-all
Omit all symbol information from the output file.

-S
--strip-debug
Omit debugger symbol information (but not all symbols) from the
output file.

<snip>
って, 書いてあるが...


590:デフォルトの名無しさん
05/03/17 20:48:22
わかりにくいなあ
なあ!

591:デフォルトの名無しさん
05/03/17 21:14:43
Solaris のコンパイラ (Forte, Sun ONE Stuido) のマニュアルには
ちゃんと書いてあるよ。

     -s   Removes all symbolic debugging information from the
          output object file. This option is passed to ld(1).
          This option cannot be specified with -g.

gcc 場合、マニュアルには確かにないねえ。
しかし gcc の info を見ると実は書いてある。
GNU 系の場合、これはありがち…
だから GNU は(ry


592:デフォルトの名無しさん
05/03/17 21:19:38
>>591
> gcc 場合、マニュアルには確かにないねえ。
> GNU 系の場合、これはありがち…

おれは, 一時期, gcc だと obsolete になったのかと思って,
-Wl で ld に渡してたぞ.

だから GNU は(ry


593:デフォルトの名無しさん
05/03/17 21:23:07
>>591-592

594:デフォルトの名無しさん
05/03/17 22:16:12
1から100までの自然数を素因数に分解して出力しなさい

誰かC言語でプログラム書いてもらえませんか?

595:デフォルトの名無しさん
05/03/17 22:18:19
>>594
俺様に命令するな!!!

596:デフォルトの名無しさん
05/03/17 22:19:29
たのみますm(__)m

597:デフォルトの名無しさん
05/03/17 22:25:36
>>594
最高速なアルゴリムを示そう。

int main()
{
fputs("2: 2\n"
"3: 3\n"
"4: 2, 2\n"
... 自分で埋めろ
, stdout);
return 0;
}




(1も素因数分解できるんだっけ?素因数ってもう忘れた)

598:デフォルトの名無しさん
05/03/17 22:34:54
うちの gcc の man page には書いてあるんだが…

> -s Remove all symbol table and relocation information from the exe-
> cutable.

gcc-3.3.3 です。





599:デフォルトの名無しさん
05/03/17 22:39:41
>>597
それって stdio のせいで遅くね?

600:デフォルトの名無しさん
05/03/17 23:00:46
writeはエラー処理がめんどくさい。
全部書けなかった時とか、EINTRとか。


601:デフォルトの名無しさん
05/03/17 23:09:51
#include <stdlib.h>
#include <stdio.h>
#define BUF_SIZE 256
int main(void)
{
int i;
char buf[BUF_SIZE];

for (i = 1; i <= 100; i++) {
snprintf(buf, BUF_SIZE, "factor %d", i);
system(buf);
}

return 0;
}


602:デフォルトの名無しさん
05/03/17 23:14:47
>>598
うちはgcc-2.95.3ですた。
gcc-3 になって心を入れ換えた?

603:デフォルトの名無しさん
05/03/18 00:16:34
>>600
fputs() でも一緒だと思うが...。

604:デフォルトの名無しさん
05/03/18 01:20:27
うんにゃ。
少なくとも全部書けなかった場合については、
fputs() は、内部で再試行してくれます。

むか〜しの SVR4 が、これをやってくれなくて欝だった
ような覚えがあるが。


605:デフォルトの名無しさん
05/03/18 02:55:44
>>604
初期のSVR4はsignalの振る舞いが、
defaultではBSD風じゃなくて、SVR3風だった。すぐに変ったけど。
だからsystem call中に、signalを受けると、エラーで失敗した。
ライブラリもsystem callに再入せず。(BSDセマンティクスだとする)


606:じじー
05/03/18 04:17:10
>>605
> defaultではBSD風じゃなくて、SVR3風だった。すぐに変ったけど。
これは、今でもそうじゃない?
signal(3) はデフォルトでは SA_RESTART しない筈。

で、ここで書いた write(2) の再試行ってのはシステムコール
リスタートの話じゃないの。それならまだ許せる。
初期の SVR4 では、write(2) が第3引数よりも少ない正の値を
返した場合 (つまり partial write の場合)、残りを単に捨て
ちゃってたような気が… つまり完全にバグ。


607:じじー
05/03/18 04:18:58
補足。
partial write の残りを捨ててたのは stdio ライブラリね。

608:デフォルトの名無しさん
05/03/19 12:45:25
>> 592 さん
gcc の man には こう書いてありますが。

The information in this man page is an extract from the
full documentation of the GNU C compiler, and is limited
to the meaning of the options.

This man page is not kept up to date except when volun­
teers want to maintain it. If you find a discrepancy
between the man page and the software, please check the
Info file, which is the authoritative documentation.

609:デフォルトの名無しさん
05/03/20 00:43:02
>>601
え  れ  が  ん  と(ニコリ

610:デフォルトの名無しさん
05/03/20 02:47:45
標準C言語スレで聞いたら怒られたのでこちらで質問させてください。
mmapの動作に関する質問です。

//#include *は省略
#define SIZE 536870912
int main() {
void *map;
int fd = open("tmp_file", O_RDWR);
size_t size = (SIZE / getpagesize() + 1) * getpagesize();

map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0);
munmap(map, SIZE);

return 0;
}

というプログラムを動かすとバスエラーになってしまいます。
また、変数sizeを使わずにSIZEを使うとセグメントエラーになります。
mmapはファイルをメモリに全部読み込まずに必要な分だけキャッシュする
とmanに書いてあるように読めたのですが、間違いでしょうか。
環境はFreeBSD 5.3R, gcc 3.4.2です。メモリは512MBです。

611:デフォルトの名無しさん
05/03/20 03:15:56
商用UNIXだったら分かるんだけどなー。

612:デフォルトの名無しさん
05/03/20 03:45:13
>>610
mmapに渡してるsizeとmunmapに渡してるSIZEは同じなのか?
つーかちゃんとエラーチェックしろよ。
とりあえずstraceでもしてみれば?

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版は持ってるし。エラッタ修正待ちも兼ねて。



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

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