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


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

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



1 名前:名無し募集中。。。 [05/01/15 02:18:37]
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド

前スレ
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使っている人いますか? その13 (UNIX板)
pc5.2ch.net/test/read.cgi/unix/1099157755/
Cygwin使っている人いますか? 3 (Windows板)
pc5.2ch.net/test/read.cgi/win/1090131123/

関連板
pc5.2ch.net/unix/
pc5.2ch.net/linux/


577 名前:デフォルトの名無しさん mailto:sage [05/03/16 01:03:40 ]


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

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

冒頭で、

using namespace std;

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

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

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


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

581 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/17 16:53:20 ]
リンクするときに-gをつけてないとか。


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



586 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/17 20:48:22 ]
わかりにくいなあ
なあ!

591 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/17 22:18:19 ]
>>594
俺様に命令するな!!!



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

597 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/17 22:39:41 ]
>>597
それって stdio のせいで遅くね?

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


601 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/17 23:14:47 ]
>>598
うちはgcc-2.95.3ですた。
gcc-3 になって心を入れ換えた?

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

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

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


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




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

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


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

608 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/20 03:15:56 ]
商用UNIXだったら分かるんだけどなー。

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

613 名前:デフォルトの名無しさん mailto:sage [05/03/20 04:06:01 ]
>>610
> #define SIZE 536870912

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

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

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

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

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

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


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



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

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


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

なことはない。

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


622 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [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 mailto:sage [05/03/20 14:11:15 ]
> mmap で使用可能な空間ですよね?
ごめんなさい,
mmap(NULL, ..., /*MAP_FIXED ではない*/)
の話.


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

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

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

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

632 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:32:10 ]
わははは!
ペイントハウスで思いのままだ!

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

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



636 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/03/20 18:21:48 ]
611の言ったとおり、やっぱり商用UNIXじゃないとな。

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

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

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

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

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


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

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



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

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

648 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 09:16:03 ]
>>646
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/basename.3.html
>path の内容を変更することがある。
だそうだ。

649 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 09:43:42 ]
ちゃんと嫁

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

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

652 名前:デフォルトの名無しさん mailto:sage [2005/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 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 13:07:56 ]
>>651
gethostbyname(3)なんかは、「*で返すのはstatic dataだべ」って書いてある。

www.opengroup.org/onlinepubs/007908799/xns/endhostent.html
のAPPLICATION USAGE



654 名前:デフォルトの名無しさん [2005/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 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 13:12:18 ]
>>654
おまえ読解力ゼロ



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

657 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 14:02:44 ]
>>652
> char * path_dup = strdup(path_dup);
< char * path_dup = strdup(dup);

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


658 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 14:03:51 ]
>>657
m9(^Д^)プギャー

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

間違えたわ…ハズ

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

661 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 18:34:51 ]
strdup1つでここまで引きずるとは、さすがUNIX

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

663 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 18:58:49 ]
ここは小学生の溜まり場かよ。

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

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

665 名前:デフォルトの名無しさん mailto:sage [2005/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 名前:デフォルトの名無しさん mailto:sage [2005/03/25(金) 14:31:04 ]
666 ∈(・◎・)∋ 666


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

668 名前:デフォルトの名無しさん mailto:sage [2005/03/26(土) 19:16:44 ]
(゚Д゚)ハァ?

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


670 名前:デフォルトの名無しさん mailto:sage [2005/03/27(日) 11:34:39 ]
別に固定バッファでもいいわけだが。

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

672 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 18:00:46 ]
ここで質問する事が問題

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

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

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

675 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 20:23:30 ]
させたいことと出来ることを一致させるのは大切ですね



676 名前:デフォルトの名無しさん mailto:sage [2005/03/30(水) 16:22:54 ]
>>674
俺も ノシ


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







[ 続きを読む ] / [ 携帯版 ]

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

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