1

私のソフトウェアでは、 IPC にPF_UNIXソケットを使用しています。

これまでは、バッファmallocに書き込む前にデータを準備するために(プレ) バッファ ビアを割り当てる必要がありましwriteた。

今、私は疑問に思っていました:

socket-fd には、たとえば、すでにバッファがあります。64kbなので、次のようにデータを直接準備してそのバッファに書き込むことができないのはなぜですか:

// stupid example-code, don't copy
void *fd_buffer = get_buffer_of_fd(fd)
fd_buffer[0] = 1
fd_buffer[1] = 2
fd_buffer[2] = 3
memcpy(fd_buffer, 5, 5)
...
commit_buffer_of_fd(fd, xbytes); // xBytes is DYNAMIC and not known until this point!!

これが可能であれば、プリバッファーへのコピー、プリバッファーからソケットへの書き込み、さらにはプリバッファーの割り当ての往復を節約できます。

それが可能かどうか誰にも考えがありますか?

4

1 に答える 1

0

ソケット バッファはカーネルが所有するため、カーネル空間への書き込みは許可されません。決して、決して。セキュリティリスクが大きすぎる。

ゼロコピーを行う唯一の方法は を使用するvmsplice(2)ことですが、ソケットでは公式にサポートされておらず、パイプ以外での使用は推奨されません。

を使用する場合はvmsplice、データをページのチャンクにコミットする必要があることに注意してくださいsysconf(_SC_PAGESIZE)。また、これは Linux のみの syscall であり、移植性がありません。

于 2013-09-10T15:27:26.497 に答える