問題タブ [libc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 新しいlibcシンボルを静的にリンクして、下位のlibcバージョンで使用する
eventfdおよびtimerfdカーネルシステムコールを使用するアプリがあります。そのためには、最新のカーネルとそれらをサポートするlibc、少なくとも2.8が必要です。
私の現在の状況は、適切なカーネルを備えたシステムを持っていますが、2.7.11 libcバージョンは、明らかに新しいsyscallに必要な機能をサポートしていません。
しかし、これらの2つのインターフェイス(timerfd、eventfd)は、おそらくlibcからの単なるsyscall呼び出しであるため、必要なシンボルを最新のlibcに静的にリンクしてから、適切なカーネルを使用して2.7.11libcでアプリを実行できるかどうか疑問に思いました。 。
静的にリンクされた関数は、libcを使用せずにsyscallを実行するだけで、安全になりますが、他の問題を見落としている可能性があります。
これが実現可能かどうか、そしてどうすればそれらの関数だけを静的にリンクできるかを誰かが知っていますか?
c - Cはファイルを1行ずつ読み取ります
ファイルから行を読み取るために、この関数を作成しました。
関数はファイルを正しく読み取り、printf を使用すると、constLine 文字列も正しく読み取られたことがわかります。
ただし、たとえば次のように関数を使用すると:
printf は意味不明な出力をします。なんで?
c++ - libc_write() に関する質問
libc_write が正確に何をするかを判断しようとしています。C++ で設計したプロセッサ シミュレータでバイナリを実行していますが、実行中のプログラムは関数呼び出し libc_write() にジャンプしました。現在、2 種類の書き込み関数があります。1 つの大きなバッファーをストリームに書き込む write() は、他のバッファーからメモリ内に連続してコピーされた多くのバッファーで構成されている可能性があります。または各バッファのサイズとともに多くのバッファを作成し、それらすべてを単一のストリームに書き込みます。libc_write は何をしますか? 書き込み、書き込み、両方、なし?
c - ダーウィンには本当に mremap がありませんか?
Macでメモリマップファイルを再マップする方法を見つけようとしています(利用可能なスペースを拡張したい場合)。
Linux の世界の友人が持っているのを見ますmremap
が、私の Mac のヘッダーにはそのような機能が見つかりません。/Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h
次のものがあります。
mmap
mprotect
msync
munlock
munmap
- でもいいえ
mremap
man mremap
私の恐れを確認します。
現在、マップされたファイルのサイズを変更したい場合は、ロードされたすべてのページを無効にする必要がありますmunmap
。mmmap
もっと良い方法があるはずです。もちろん?
Mac OS X と Linux で動作するコードを書こうとしています。必要に応じて、それぞれのケースで最適な関数を使用するようにマクロを設定することもできますが、適切に実行することをお勧めします。
c - Cでptrdiff_tはどこで定義されていますか?
Cのどこでptrdiff_t
定義されていますか?
c - memsetよりもメモリをゼロにするより速い方法は?
私はそれが本当に速いことを学びましたmemset(ptr, 0, nbytes)
が、もっと速い方法はありますか (少なくとも x86 では)?
memset は を使用していると思いますがmov
、メモリをゼロにするとき、ほとんどのコンパイラはxor
より高速であるため、正しいですか? edit1: GregSが指摘したように、レジスタでのみ機能するのは間違っています。私が考えていたことは何でしょう?
また、私よりもアセンブラーに詳しい人に stdlib を見てもらうように依頼したところ、x86 では memset が 32 ビット幅のレジスターを十分に活用していないとのことでした。しかし、その時はとても疲れていたので、それを正しく理解できたかどうか自信がありません。
edit2 : この問題を再検討し、少しテストを行いました。これが私がテストしたものです:
結果:
-O3 を除いて、zero_1 が最も遅いです。zero_sizet は、-O1、-O2、および -O3 でほぼ同等のパフォーマンスで最速です。memset は常に zero_sizet よりも低速でした。(-O3 の場合は 2 倍遅くなります)。興味深い点の 1 つは、-O3 で zero_1 が zero_sizet と同等に高速だったことです。ただし、逆アセンブルされた関数には、約 4 倍の命令がありました (ループの展開が原因だと思います)。また、zero_sizet をさらに最適化しようとしましたが、コンパイラは常に私よりも優れていましたが、ここで驚くことではありません。
今のところ memset が勝っていますが、以前の結果は CPU キャッシュによって歪められていました。(すべてのテストは Linux で実行されました) さらなるテストが必要です。次はアセンブラを試してみます:)
edit3:テスト コードのバグを修正しました。テスト結果は影響を受けません
edit4:逆アセンブルされた VS2010 C ランタイムを調べてmemset
いると、SSE に最適化されたゼロのルーチンがあることに気付きました。これを倒すのは難しいでしょう。
c - Linux で syscall 関数を再実装 (またはラップ) するにはどうすればよいですか?
open() システム コールを完全に引き継いで、おそらく実際のシステム コールをラップしてログを記録したいとします。これを行う 1 つの方法は、LD_PRELOAD を使用して、open() エントリ ポイントを引き継ぐ (ユーザーが作成した) 共有オブジェクト ライブラリをロードすることです。
次に、ユーザーが作成した open() ルーチンは、glibc 関数へのポインターを ing して呼び出して取得しopen()
ますdlsym()
。
ただし、上記で提案したソリューションは動的なソリューションです。自分のopen()
ラッパーを静的にリンクしたいとします。どうすればいいですか?メカニズムは同じだと思いますが、ユーザー定義open()
と libcの間にシンボルの衝突があると思いopen()
ます。
同じ目標を達成するための他のテクニックを共有してください。
c - POSIX lfind()/ lsearch()は、手動でループするよりもパフォーマンスが優れていますか?
一致するまで各アイテムをチェックする一般的なループソリューションよりも優れていますlfind
かlsearch
?これらの機能が存在する特別なソース/理由はありますか?
c - strtofおよびstrtodへのendptrパラメーターが非constcharポインターへのポインターであるのはなぜですか?
標準Cライブラリは機能strtof
しstrtod
、次のシグネチャを持っています。
それらはそれぞれ、入力文字列str
を3つの部分に分解します。
- 最初の、おそらく空の空白のシーケンス
- 浮動小数点値を表す文字の「サブジェクトシーケンス」
- 認識されない(変換に影響を与えない)文字の「トレーリングシーケンス」。
でない場合endptr
はNULL
、*endptr
変換の一部であった最後の文字の直後の文字へのポインターに設定されます(つまり、末尾のシーケンスの開始)。
私は疑問に思っています:endptr
それでは、なぜ非const
char
ポインタへのポインタなのですか?文字列(入力文字列)*endptr
へのポインタではありませんか?const
char
str
select - recv()される準備ができているバイト数の決定
select()を使用して、recv()の呼び出しがブロックされるかどうかを判断できますが、読み取り対象のバイトであると判断したら、実際にrecv()を呼び出す前に、現在使用可能なバイト数を照会する方法です。 )?