- 1 名前:login:Penguin [2005/06/06(月) 11:19:09 ID:uXQqRJXF]
- Linux のプログラミングに関する話題です
- 560 名前:login:Penguin mailto:sage [2008/01/23(水) 11:43:41 ID:G50LtKQp]
- >>557
単純にショートカットじゃダメ? if ((stat(FileSt,&sb)==1) && (sb.st_size>0)) { ... }
- 561 名前:login:Penguin mailto:sage [2008/01/24(木) 01:44:45 ID:XcZJxRmS]
- >>560
それやってたんですが、うまく行かない。 あ、括弧なしだったからかな? 括弧つけてみます
- 562 名前:login:Penguin mailto:sage [2008/01/24(木) 09:06:49 ID:+0KdBqsj]
- recvfromってタイムアウト設定はできないんですか?
データが届かなかったら永久に待ってそうです UDPのプログラムで任意の時間返答が無かったら さっさとrecvfromを抜けたいんですが...
- 563 名前:login:Penguin mailto:sage [2008/01/24(木) 09:12:54 ID:+a49+I+1]
- >>562
selectを使いたくないならSO_RCVTIMEO
- 564 名前:login:Penguin mailto:sage [2008/01/24(木) 09:44:54 ID:+0KdBqsj]
- >>663
int timeout = 5000 setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); とやっても抜けられないです...やはりずっととまったままです
- 565 名前:login:Penguin mailto:sage [2008/01/24(木) 09:51:20 ID:+a49+I+1]
- struct timevalとintって?同じもの?だっけ?5000秒?待ったり?
- 566 名前:login:Penguin mailto:sage [2008/01/24(木) 10:06:19 ID:A5lAfTzI]
- >>565
struct timeval と int は別
- 567 名前:login:Penguin mailto:sage [2008/01/24(木) 10:17:10 ID:FNc6yZ5O]
- 565 は知ってて書いているようにしか見えない。
>>564 ためしてないが、その setsockopt(2) は EINVAL になってたりしないか?
- 568 名前:login:Penguin mailto:sage [2008/01/24(木) 10:20:13 ID:+0KdBqsj]
- >>565-567
できました!
- 569 名前:login:Penguin mailto:sage [2008/01/24(木) 10:27:34 ID:+0KdBqsj]
- おかげさまでタイムアウトは無事できました
まだ疑問があるのですが struct timeval tm; tm.tv_sec = 5; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (void*)&tm, sizeof(struct timeval)); とやってもrecvfromにてあきらかに12秒近く待たされています... あんまり厳密に守られるわけではないのでしょうか? 他のシステムコールの呼び出し等にて7秒以上かかってるとも思えないのですが
- 570 名前:login:Penguin mailto:sage [2008/01/24(木) 10:57:59 ID:+a49+I+1]
- 名前解決じゃね?
- 571 名前:login:Penguin mailto:sage [2008/01/24(木) 11:16:26 ID:+0KdBqsj]
- >>570
ipアドレスをinet_addr直でやってます.
- 572 名前:login:Penguin mailto:sage [2008/01/24(木) 11:27:31 ID:Z64zlv7x]
- >>571
tm.tv_usecはクリアした?
- 573 名前:login:Penguin mailto:sage [2008/01/24(木) 11:52:54 ID:+0KdBqsj]
- >>572
なんという不注意...注意散漫になってるようです. 無事指定時間でタイムアウトさせる事ができました.ありがとうございます
- 574 名前:login:Penguin mailto:sage [2008/01/28(月) 19:51:08 ID:oy6mNs1o]
- 現在、2枚のNICを持つマシン上での開発でつまづいています。
それぞれのNICに同じネットワークのIPアドレスを振ります。 例:eth0:192.168.1.10 eth1:192.168.1.11 この状態で、普通にSOCK_DGRAMにてソケットを生成し、適当なIP アドレスに対して送信します。 すると、どちらのNICから出すかはルーティングテーブルでどちらが 上に位置するかで決まってしまいます。 これをNICを指定して送信したいのですが、可能でしょうか? RAWソケットを使えばできるのですが、仕様上の制限があって 使えません。
- 575 名前:login:Penguin mailto:sage [2008/01/29(火) 09:35:56 ID:Jv26bMRM]
- >>574
bindしてから送信 はどうだろう やったことないけど
- 576 名前:login:Penguin mailto:sage [2008/01/29(火) 09:52:16 ID:BgbmjeIx]
- >>575
source address を指定したいわけじゃなくて、どのインタフェースから 出したいか、ということだったらそれじゃぁダメだ。 >>574 がなんでそんなことしたいか知らないけど、iptableのmangle tableで markして、iproute2で該当するパケットだけルーティングテーブルを別けて やるほうが自然だろう。 www.atmarkit.co.jp/fsecurity/rensai/lids12/lids01.html もしこっちが使えないならrawソケットでやるしかないよ。
- 577 名前:login:Penguin [2008/01/29(火) 15:44:25 ID:Jv26bMRM]
- ところで
main(){ int a=0; for(;;){ printf("%d\n",a++); sleep(1); } } みたいなプログラムを書いたんだけど、これを $ ./a.out > hoge としてもhogeに出力されない。 バッファリングされてるみたいなのでprintfの後ろに sync()やらfsync(1)やら入れてみたけど駄目っぽい これどうしたらいいんだっけ?
- 578 名前:login:Penguin mailto:sage [2008/01/29(火) 16:25:19 ID:E7XlIkuM]
- fflush(stdout);
- 579 名前:login:Penguin mailto:sage [2008/01/29(火) 22:53:11 ID:pK88c6Qm]
- いまどき\nでフラッシュしないstdoutがあるのか・・・
- 580 名前:login:Penguin mailto:sage [2008/01/30(水) 02:17:24 ID:VGRpnUoT]
- そりゃ・・・、端末に向いてない stdout(3) なら line buffered じゃなくても
いいんでわ。
- 581 名前:574 mailto:sage [2008/02/01(金) 11:04:33 ID:KZ/Tojjt]
- レス遅れてしまいすみません。
>>575 >>576さんの言うとおりbind()をしてから送信すると、L3レベルでは大丈夫 でしたがEtherealでキャプチャするとL2レベルで、MACアドレスが同じに なっていました。 >>576 提示してもらったWebを確認しました。現在開発しているのはなかなか 処理能力的にシビアな箇所なので、RAWソケットを使用できるように 説得してみます。
- 582 名前:login:Penguin mailto:sage [2008/02/01(金) 19:24:02 ID:MPKtEvB1]
- というか、bondingしてあとは知らん、ではなんかいかんの?
- 583 名前:574 mailto:sage [2008/02/03(日) 21:37:06 ID:mkJ6nZ+Q]
- >>582
bonding、初耳だったのでぐぐってみましたが中々興味深い技術です。 ですが、仕様上送信元IPアドレス(つまり自分が持つやつ)が複数あり、かつ 対向の種類によって決まってしまっているので使えないようです。 けどこの技術に似たようなのを実装しなければならない機能ブロックも あるのでこれはこれで提案してみようかと思います。 そういえば、RAWソケットって送信するときにPath MTU Discoveryをソケット オプションで無効にしてもフラグメントされないなーと思ったら、man raw(7)に バグとして挙がっているんですね…(使用OSはFedora7) これも自分で実装しなければならないなぁ。
- 584 名前:login:Penguin mailto:sage [2008/02/03(日) 22:24:34 ID:+lhwKKGQ]
- >>574
最初から難しいこと考えないで、まず既存の機能 (>>576 の iptable + iproute2等) で やってみて、それでパフォーマンスなどの問題がないかどうか確認して、どうしても 独自に実装しなくてはならないことを確認してから raw ソケットなり、カーネル モジュールで何か作るなりすることを検討するほうがいいぞ。
- 585 名前:login:Penguin [2008/02/04(月) 19:10:09 ID:hfVjOmBk]
- 自分のサブネットマスクを取得するのはどう書きますか?
IPアドレスは分かってるとして。
- 586 名前:login:Penguin mailto:sage [2008/02/04(月) 21:29:01 ID:nLbVhZ24]
- >>585
getifaddrs(3)
- 587 名前:login:Penguin mailto:sage [2008/02/04(月) 21:35:32 ID:G8QRQQli]
- >>586
IPv4でも使えんの?
- 588 名前:login:Penguin mailto:sage [2008/02/04(月) 21:56:25 ID:nLbVhZ24]
- >>587
使える。v4でしか使えないバグならglibcが2.3の頃にあったはずだが。
- 589 名前:login:Penguin mailto:sage [2008/02/05(火) 18:12:27 ID:MeDWiyY9]
- 大量のスレッドを生成できなくて困っています。
現在、上限10000個のスレッドを生成したいのですが(そういう仕様なので…OTL) スタックオーバーフローで生成できていません。 解決策としては、デフォルトでは大きすぎるスタックサイズを pthred_attr_setstacksize() で減らし、また予めスレッド用スタック領域を malloc()にて確保し、これをpthread_attr_setstackaddr() にて設定することを 考えました。実際やってみると確かにデフォルトよりは生成数は上がっているの ですが、到底10000個には追いつきません。 そこで質問なのですが、上記のようなアプローチで合っているのでしょうか? あと、pthread_attr_setstackaddr() の第2引数(つまり、スタック開始アドレス)は 10000個のスレッドで同一なのでしょうか? 10000回のpthread_create()ループの外で1回だけ pthread_attr_setstack(&attr, g_pthread_stack) をこーるするのか、 ループの中で pthread_attr_setstack(&attr, g_pthread_stack+STACK_SIZE*i)のように スタックサイズ分オフセットを毎回させるのか が分からないです。
- 590 名前:login:Penguin mailto:sage [2008/02/05(火) 18:15:04 ID:GUozEVBV]
- それができたとしてうまく動くと思ってやってるの?
- 591 名前:login:Penguin mailto:sage [2008/02/05(火) 20:56:19 ID:SlsIEQrM]
- 何をやるのか、メモリをどれだけ積んでるか、ということによりけりだな。
pthreadとか知らんのでclone(3)で自分でスタックを用意して一万個ほど スレッドを生成したことはある。使い方によっては普通に動く。
- 592 名前:login:Penguin mailto:sage [2008/02/05(火) 21:03:59 ID:GUozEVBV]
- それはすごい。
- 593 名前:login:Penguin mailto:sage [2008/02/06(水) 06:41:46 ID:nwp5GfWb]
- AMD64とかIA64とかでメモリを64GBくらい積めば大丈夫じゃね?
- 594 名前:login:Penguin mailto:sage [2008/02/06(水) 07:25:44 ID:s++avmRm]
- カーネル側で使うのが各スレッド8KB。ユーザ側のスタックを4KBに抑えれば
スレッドをひとつ増やすごとに必要なのは12KB。10000個ならざっと120MB。
- 595 名前:login:Penguin [2008/02/07(木) 00:54:55 ID:GYgs3mMU]
- >>589
> あと、pthread_attr_setstackaddr() の第2引数(つまり、スタック開始アドレス)は > 10000個のスレッドで同一なのでしょうか? 同一で良いはずが無いねえ。スレッド毎に確保ですよ。 スタックの先頭アドレスはページ境界にアラインさせないとsetstackaddrがEINVALで失敗する。 mallocではなくて、posix_memalignかmmapでスタック用のメモリを確保するとよい。
- 596 名前:585 mailto:sage [2008/02/08(金) 09:16:22 ID:Tg+rPbrB]
- サンクス! >>586 , etc...
それググってみましたが、IPアドレスが幾つも取れるじゃないですか。 その中でIPアドレスをマッチングして、そのサブネットマスクを取るしかないんでしたっけ? それとも、サブネットマスクって1台のマシンに複数IPアドレスがあっても共通?
- 597 名前:login:Penguin mailto:sage [2008/02/09(土) 00:02:49 ID:1XOuKxIO]
- つーか、IPアドレスに対して、サブネットが対応してるでそ。
インターフェースが2枚あったら、 eth0 : 192.168.1.5/24 eth1 : 10.23.45.67/16 とかさ。
- 598 名前:login:Penguin mailto:sage [2008/02/09(土) 01:25:11 ID:eMQaM6TS]
- man引けば分かるはずなんだが、今の場合はそれ以前の問題のような。
プログラミングより、くだ質が妥当なような。
- 599 名前:login:Penguin mailto:sage [2008/02/09(土) 01:57:14 ID:pxZu1S51]
- >>598
manを引いても基本原則知らなきゃわかんないだろうな こういうのを一番簡単に身につけるには 教科書的なものを頭ッから丸暗記するのが手っ取り早い
- 600 名前:login:Penguin mailto:sage [2008/02/10(日) 17:43:00 ID:AB987pUW]
- mallocをすると、値が帰ってくる前にsegmentation faultするんだけど・・・
これはライブラリの領域をどこかで破壊しているということでよろしいのでしょうか
- 601 名前:login:Penguin mailto:sage [2008/02/10(日) 18:47:08 ID:rgXsI3qI]
- gdbで引っ掛けてどこで死ぬかを見極めるべし
まあメモリ破壊の類だとは思うが
- 602 名前:login:Penguin mailto:sage [2008/02/10(日) 20:52:25 ID:+TLKCHqg]
- >>600
メモリ破壊だったら、Electric Fenceが便利かもね。
- 603 名前:login:Penguin mailto:sage [2008/02/10(日) 20:55:13 ID:qj0nK6Tb]
- valgrindのほうが。
- 604 名前:login:Penguin mailto:sage [2008/02/10(日) 23:03:17 ID:W61q/SHI]
- 自分に強壮剤がいいよ
- 605 名前:login:Penguin mailto:sage [2008/02/11(月) 12:45:49 ID:0peP2Ab+]
- >>601-603
ありがとう ドリンク飲んでがんばります
- 606 名前:login:Penguin [2008/02/11(月) 20:57:09 ID:JHZIo94H]
- >>600
エラー処理をしているのかと子一時間 NULLが帰ってきたら、どうしてるの?
- 607 名前:login:Penguin mailto:sage [2008/02/11(月) 20:59:54 ID:NXuZoz9l]
- 実際mallocでNULL返ってくるの? CoWなのに。
- 608 名前:login:Penguin mailto:sage [2008/02/11(月) 21:58:06 ID:g58d+k53]
- >>607
CoWは関係ないような。 というのはともかく、極端に大きなmallocならNULLが戻るよ。 搭載メモリ量とか、32bit/64bitにもよるかもしれないけど、malloc(1*1024*1024*1024)とか。
- 609 名前:login:Penguin mailto:sage [2008/02/11(月) 22:59:43 ID:v7vkIa+N]
- >>607
物理ページ自体は必要ないが、メモリ空間が足りなくなる可能性はある x86 (32bit) だと、ユーザ空間が3GB・カーネル空間が1GBで分けられてたはずだから、 多分2.5GB確保は成功して、3GB確保は失敗すると思う
- 610 名前:login:Penguin mailto:sage [2008/02/11(月) 23:27:43 ID:g58d+k53]
- >>609
適当なプロセスをcat /proc/pid/mapsしてみればわかるけど、.soやらなにやらが3GBのそこかしこにmapされてしまっているから、 2.5GB連続で仮想メモリ確保ってのは難しいと思うよ。 例えばfirefoxあたりだと色々mmapされすぎていて全く無理ですね。
- 611 名前:login:Penguin mailto:sage [2008/02/11(月) 23:49:20 ID:H5r6W4j2]
- >>606
>>600は「値が帰ってくる前に」と言ってるんだから、NULLが帰ってくるも ヘッタクレもないと思うんだが。 当然、返り値をチェックしようとしているけど、帰ってくる前にSIGSEGVなんだろ。
- 612 名前:login:Penguin mailto:sage [2008/02/12(火) 21:41:58 ID:i/htmIMa]
- ファイルAとBが同一パーティション上にあるかどうかLinux的にはどうやって判断すればいいんでしょうか
- 613 名前:login:Penguin mailto:sage [2008/02/12(火) 23:16:42 ID:6Xg+LWoP]
- パーティションよりファイルシステムの場所を調べる方が汎用性があって
尚且つ簡単そうで良さげ。スクリプトでやっつけるならdfにパスを食わせて 出たファイルシステムを比較すれば一丁上がり、、、かなぁ。 どうしてもパーティション、という場合は知らん。
- 614 名前:login:Penguin mailto:sage [2008/02/12(火) 23:25:33 ID:vZRSZKGy]
- 今Linuxが手元にないんだけど、レギュラーファイルに対してstat(2)すると
struct stat::st_devってどうなるんだっけ?
- 615 名前:login:Penguin mailto:sage [2008/02/12(火) 23:36:11 ID:i/htmIMa]
- >>613
ありがとうございます。mtab読みに行くことにしました。
- 616 名前:login:Penguin mailto:sage [2008/02/12(火) 23:48:38 ID:943cnSqV]
- >>614
vmware+Linux入れなよ
- 617 名前:login:Penguin mailto:sage [2008/02/13(水) 00:42:27 ID:XbwK8Zpg]
- >>614
普通はそれだと思う
- 618 名前:614 mailto:sage [2008/02/13(水) 01:03:45 ID:eUvEe13x]
- >>617
汲み取ってくれて、ありがとう。
- 619 名前:login:Penguin mailto:sage [2008/02/13(水) 07:33:31 ID:pBknmnOU]
- 結局、パーティションまでは分からんということだな。
- 620 名前:login:Penguin mailto:sage [2008/02/13(水) 07:47:41 ID:hT3T8ff2]
- >>619
>>614にあるのじゃどうしてだめなの?
- 621 名前:login:Penguin mailto:sage [2008/02/13(水) 11:59:04 ID:G1ltJVUD]
- HTTPクライアントを作ろうと思いますが、
自分の空きポートはどうやったら取得できますか?
- 622 名前:login:Penguin mailto:sage [2008/02/13(水) 12:14:39 ID:5QyCkyQ9]
- >>621
HTTPクライアントならサーバの80につなげば いいだけじゃない?空きポートを知る必要が わからん。(connect()で80につなげばいいだけ。) クライアントの使用するポートはプロトコルスタックが 空いているポートを適当に割り振ってくれる。
- 623 名前:621 mailto:sage [2008/02/13(水) 12:23:24 ID:G1ltJVUD]
- >>622
あっ、そーですか。有難う。 httpで相手のポート80に接続して、writeするだけですね。 (tcpと大して変わらないのかって、tcpで接続するプログラム書いたことないけど) 関係ないけど、それらがC/C++のクラスライブラリになってたりしませんよね?
- 624 名前:login:Penguin mailto:sage [2008/02/13(水) 12:25:48 ID:YOhJXxZI]
- >>623
curl と言いたいけど、お前にはsystem("wget wwwwwwwww");で充分だ。
- 625 名前:login:Penguin mailto:sage [2008/02/13(水) 13:21:11 ID:hYkhPPAJ]
- >>623
TCP 以外の何でアクセスするつもりなんだ?
- 626 名前:login:Penguin mailto:sage [2008/02/13(水) 18:02:37 ID:G1ltJVUD]
- >>625
HTTP ところで、HTTPエンコードする標準メソッドなんてありますか?
- 627 名前:login:Penguin [2008/02/13(水) 18:20:50 ID:G1ltJVUD]
- 知りたいのは、HTTP エンコードじゃなくて、URL エンコードでしたorz
- 628 名前:login:Penguin mailto:sage [2008/02/13(水) 19:29:27 ID:Mx9E0jHA]
- >>626
HTTPってTCPじゃね?
- 629 名前:login:Penguin mailto:sage [2008/02/13(水) 19:59:54 ID:JBOJRmRv]
- >>626を見ると、>>624は正しかったんだな、と思った。
- 630 名前:login:Penguin mailto:sage [2008/02/13(水) 20:54:09 ID:eUvEe13x]
- >>628
あらゆる意味で違うと、いちおう突っ込んでおけばいいかな?
- 631 名前:login:Penguin mailto:sage [2008/02/13(水) 21:03:49 ID:N8sc8JVE]
- >>628
TCPってIPじゃね? 以降物理層まで続く↓
- 632 名前:正義の味方 [2008/02/13(水) 23:20:51 ID:5UuGIiF+]
- 地球を救う正義の味方、今こそ参上!!
seiginomikata.xxxxxxxx.jp/
- 633 名前:login:Penguin mailto:sage [2008/02/14(木) 01:22:24 ID:AMxoEq8N]
- >>624 そんなあなたに ttp://www.blue.sky.or.jp/grass/doc_ja.html
- 634 名前:login:Penguin mailto:sage [2008/02/14(木) 05:16:55 ID:vPDIK5xn]
- HTTP on TCP on IP on Ethernet
- 635 名前:login:Penguin mailto:sage [2008/02/14(木) 10:46:16 ID:yt/o7Lpq]
- UDPはTCPじゃないおねw
- 636 名前:login:Penguin mailto:sage [2008/02/22(金) 11:00:23 ID:G/AgynaC]
- 自分が開いているファイルポインタを監視して,
ほかのプロセスから見られているかどうかをチェックする方法ってありますかね?
- 637 名前:login:Penguin mailto:sage [2008/02/23(土) 18:26:40 ID:fMtbJMPF]
- inotify...でできたようなできなかったような。
- 638 名前:login:Penguin [2008/02/24(日) 23:17:29 ID:BrtZUi2N]
- streaming.linux-magazin.de/en/program_fosdem.htm
cmakeについてのリアルタイム講演が聞けるそうな
- 639 名前:login:Penguin mailto:sage [2008/02/25(月) 17:29:44 ID:gh7YVSGk]
- gdbってスレッドの中まで追跡してくれないよね?
今開発しているプログラムが生成したスレッドの中で何かおかしなことを やってるみたいなのだが再現性が100%にならず困っている. gdbでlistとかやっても表示されるのはスレッドを生成してる 関数のところが表示される. せめてどこで落ちてるのか分かればいいんだが...
- 640 名前:login:Penguin mailto:sage [2008/02/25(月) 17:56:48 ID:cSNR/6sC]
- マルチコア環境上で、指定したスレッドを実行しているCPU番号を取得する
方法はないでしょうか? ちょうど、RTLinuxでいうrtl_getcpuid()のようなものを探しています。 # sched_setaffinity() を利用したCPU括り付けでのマルチスレッドの動作確認を しようと思っています。
- 641 名前:login:Penguin mailto:sage [2008/02/25(月) 18:39:00 ID:/pUYRVYK]
- info threads
thread thread_no
- 642 名前:login:Penguin mailto:sage [2008/02/26(火) 22:09:55 ID:Gzm7dZQg]
- >>640
CPU番号を取得するのがカーネル空間なのかユーザ空間なのかで違う。 カーネル空間ならthread_infoのcpuを読めばいい。 ユーザ空間ならthread_infoのcpuを読むようなカーネルモジュールを作って システムコールで呼ぶしかない。ただ、システムコールのためにカーネル空間に入って 戻ってきたときには別のCPUに切り替えられているかもしれないので使い物にならない。
- 643 名前:login:Penguin mailto:sage [2008/02/26(火) 22:12:32 ID:Gzm7dZQg]
- >>636
fuserでも呼べば?
- 644 名前:login:Penguin [2008/02/27(水) 01:24:58 ID:YHDpNSRs]
- >>639
スレッドの本を読んで勉強するほうが早い
- 645 名前:login:Penguin mailto:sage [2008/02/27(水) 02:36:14 ID:s4UfhcJi]
- >>639
>>641のコマンドをgdbで実行すれば追跡できるけど? gdbはVer.5辺りからスレッドに対応してるよ。
- 646 名前:login:Penguin mailto:sage [2008/03/04(火) 05:37:01 ID:hH79PlpS]
- Linuxではディレクトリをopenしてファイルディスクリプタを
得ることはできないのでしょうか?
- 647 名前:login:Penguin mailto:sage [2008/03/04(火) 06:57:58 ID:YiS1gKTk]
- >>646
opendir?
- 648 名前:login:Penguin mailto:sage [2008/03/04(火) 11:16:05 ID:c6KWa7j/]
- ファイルディスクリプタが欲しいんですよ。
ディレクトリのディスクリプタに対してlockfしたらどうなるか試したかったもので。
- 649 名前:login:Penguin mailto:sage [2008/03/04(火) 11:18:58 ID:f138xmmP]
- man open
O_DIRECTORY
- 650 名前:login:Penguin mailto:sage [2008/03/05(水) 21:11:41 ID:DSOAwXvG]
- (引数+環境変数)の長さはARG_MAXで制限されると見たのですが、実験してみると
ARG_MAXをはるかに超えて環境変数を保存できるようです。 これはそういう仕様と理解していいのでしょうか?ポインタでも示していただけると幸いです。 Linux ru 2.6.22-14-generic #1 SMP Tue Feb 12 07:42:25 UTC 2008 i686 GNU/Linux #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(int argc, char *argv[]) { char* str; int i; int size = 10000*1024; str = malloc(size); fprintf(stderr, "ARG_MAX=%d\n", sysconf(_SC_ARG_MAX)); memset(str, 'a', size); memcpy(str, "hoge=", 5); putenv(str); printf("%s", getenv("hoge")); free(str); return 0; }
- 651 名前:login:Penguin mailto:sage [2008/03/06(木) 20:49:10 ID:xYqhiEhk]
- >>650
仕様かどうかは知らんが、free(str)の前にsystem("ls");といれて、 straceつきで実行してみればARG_MAXがどこに効いているかわかるんじゃね?
- 652 名前:login:Penguin mailto:sage [2008/03/07(金) 02:06:25 ID:6CTqh5eF]
- 650じゃないけどやってみた。
現在の環境変数hogeの5文字目を読むプログラムenvcをsystem()で実行。 execve("/bin/sh", ["sh"..., "-c"..., "./envc"...], ["other-env=.....", "hoge=aaaaabaaaaaaaaaaaaaaaaaaaaa"...]) = -1 E2BIG (Argument list too long) exit_group(127) = ? で失敗するよう。 自プロセス内のputenv,getenvは単にアドレスを保存しているだけみたいな感じ。
- 653 名前:login:Penguin mailto:sage [2008/03/07(金) 08:22:54 ID:UMdAZxi/]
- Linuxでどうやってるのか知らないけど、古典的なUnixだとputenvしたときには
書く場所がなければmallocして場所を作るしなあ
- 654 名前:650 mailto:sage [2008/03/07(金) 18:57:12 ID:WLDLR5XW]
- ありがとうございます。
そういえば FreeBSD の putenv も malloc していたような記憶があります。
- 655 名前:login:Penguin mailto:sage [2008/03/09(日) 22:25:35 ID:OicC4WBL]
- kernel 2.6.22でnetdevice.hのnet_deviceに
なぜstruct net_device *next消えてるの? linux-sourceにはあるが linux-headerには無い なぜ?
- 656 名前:login:Penguin mailto:sage [2008/03/09(日) 23:46:44 ID:8q2J0afq]
- >>655
linux-(source|header)にある/ないは知らんが、struct net_device::next が消えた理由は以下らしいよ。 ttp://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.22.y.git;a=commit;h=7562f876cd93800f2f8c89445f2a563590b24e09
- 657 名前:login:Penguin mailto:sage [2008/03/11(火) 01:36:58 ID:Rs8OmFO7]
- >>655
なるほど解ったどもね 今snullベースで 仮想Ethernetデバイスを作ってるんだけど たとえばeth0がすでに登録されてて eth0のパケットをsnull0で送受信したい場合って initの中で dev_get_by_name("eth0); でeth0のnet_devicはとって来れるけどこいつを どうやって料理すればいいんだ? なーんにも思いつかないw
- 658 名前:login:Penguin [2008/03/15(土) 18:03:02 ID:NRAbwdcX]
- /usr/include/pgsql/server/postgres.h と /usr/include/wand/MagickWand.h を
一緒に #include すると、コンパイル時に以下の警告が出るのですが、 これってどうにかならないもんしょうか? /usr/include/pgsql/server/pg_config.h:14 から include されたファイル中, /usr/include/pgsql/server/c.h:53 から, /usr/include/pgsql/server/postgres.h:48 から, main.c:9 から: /usr/include/pgsql/server/pg_config_x86_64.h:571:1: 警告: "PACKAGE_BUGREPORT" が再定義されました /usr/include/wand/wand-config.h:10 から include されたファイル中, /usr/include/wand/MagickWand.h:29 から, main.c:8 から: /usr/include/wand/wand-config-64.h:491:1: 警告: ここが以前の宣言がある位置です 以下が重複しているようです。 PACKAGE_BUGREPORT PACKAGE_NAME PACKAGE_STRING PACKAGE_TARNAME PACKAGE_VERSION ググっても分からなかったので、せめてヒントでももらえると助かります。 環境はCentOS 5、postgresql-8.2.5-2PGDG、ImageMagick-6.2.8.0-3.el5.4 です。 コンパイルコマンドは以下のような感じです。 gcc main.c -m64 -I/usr/include/pgsql/server -lpq -lWand
- 659 名前:login:Penguin mailto:sage [2008/03/15(土) 20:05:58 ID:f5+YWLcF]
- >>658
そのヘッダの中身見てないけど、警告がでないようにするなら、 1. postgres.h,MagickWand.hを#includeしている間に#undef PACKAGE_* を入れる。 2. main.cから、postgres.hが必要な部分とMagickWand.hが必要な部分を 別々のファイルに関数として切り出して、それぞれのファイルでは postgres.hかMagickWand.hのどちらかのみ#includeする。 のいずれかでどうよ?
- 660 名前:login:Penguin mailto:sage [2008/03/15(土) 20:50:51 ID:NRAbwdcX]
- >>659
やっぱそうするしかないよねー。 前者の方法でやってみるー。ありー。
|

|