-4

バッファを表示しようとしていますが、特殊文字で表示されています。これが私のコードです:

size_t write(int fd, const void *buf, size_t count)
{

    static size_t (*write_func)(int, const void *, size_t) = NULL;
    if (!write_func)
        write_func = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT, "write");


    char tmp[count];  

    memcpy(tmp,buf,count);
    printf("  %c \n",tmp[1]);

これを修正する方法についてのアイデアはありますか? どうもありがとう!

4

1 に答える 1

0

読み取り専用データのコピーをスタックに割り当てます。スタックスペースが限られている可能性があるため、これは危険です。(Linux では、元のスタックのみが動的に拡張されます。スレッド スタックは固定サイズであり、多くの場合非常に小さいです。)

次に、 stdio.hprintf()関数を使用して、指定されたデータの 2 番目のバイト ( count1 の場合もあります) を標準出力に出力するため、一時配列の外部にアクセスする可能性があります。

ほとんどの実装では、バッファーをフラッシュするために内部的にprintf()呼び出します。write()リンケージによっては、これが再帰的になる可能性があり (printf呼び出す関数を呼び出す関数呼び出しprintfなど)、プロセスで使用可能なすべての RAM を使い果たし、クラッシュする可能性があります。

上記のどれも意味がありません。

まず、入力データを複製する必要がある場合は、 and を使用して動的に複製しmalloc()memcpy()その後free()で複製します。そうすれば、マルチスレッド プログラムで突然クラッシュが発生することはありません (Linux では、元のプロセス以外のすべてのスタック スペースが制限され、固定されています)。

write_func次に、リンカーを使用して取得したオリジナルを使用する必要があります。

errno第 3 に、クライアント プログラムで予期しない問題が発生しないように保持する必要があります。一時的なローカルintを使用して保存してください。だけwrite()でなく、 もmalloc()free()変更する可能性があることを忘れないでくださいerrno。これらの変更を呼び出し元から隠す必要があります。

4 番目に、 の戻り値の型はwrite()is ssize_t, notsize_tです。前者は署名されていますが、後者は署名されていない場合があります。

第 5 に、短い書き込みは常に許可されます。「完全な」チャンクを取得することに頼ることはできません。アプリケーションは内部処理を行い、特にソケットを操作する場合は、奇妙なサイズ (特に TCP/IP と UDP/IP の MTU の倍数) でフラッシュします。入力/出力への「変更」はステートレスでなければなりません。さらに悪いことに、変更によってバッファー長が変更され、記述子がノンブロッキングであり、write_func()呼び出しは、変更された部分のちょうど真ん中に短い書き込みを返します。これは、元のバイトに適切にマッピングされていません。どのように処理しますか? 記述子はノンブロッキングであるため、実際には再試行できません。元のアプリケーションがハングする可能性があります。たとえば、厳密な順序要件を持つピア プロセスからデータを同時に送受信するコプロセス方式で使用された場合などです。これは、アプリケーション ロジック レベルで書き込みが許可されていない場合に、追加によって書き込みが再発行されるためです。

簡単に言えば、あなたの計画はうまくいきません。特定の単純なアプリケーションで動作するようになるかもしれませんが、他のアプリケーションをひどく壊す可能性があります. 何を達成しようとしても、もっと良い方法があります。

私があまり率直ではないことを願っていますが、ラッパーを作成する前に、まず低レベルの POSIX I/O の詳細を学ぶことを真剣にお勧めします。Linux man-pages プロジェクトは、私が推奨できる優れたリファレンスですが、最初にいくつかのチュートリアルから始める必要があると思います。

于 2012-07-04T20:56:46.043 に答える