(Xlib/XCBを使用してバイパスするために)要求を直接Xサーバーに送信するためにソケットをオープンしています。UNIXソケットのバッファ書き込み?
#define X11_OP_REQ_CREATE_WINDOW 0x01
#define X11_OP_REQ_MAP_WINDOW 0x08
#define X11_OP_REQ_CREATE_PIX 0x35
#define X11_OP_REQ_CREATE_GC 0x37
#define X11_OP_REQ_PUT_IMG 0x48
...
struct sockaddr_un serv_addr = {0};
int socketfd = socket(AF_UNIX, SOCK_STREAM, 0); // Create the socket!
serv_addr.sun_family = AF_UNIX;
strcopy(serv_addr.sun_path, "/tmp/.X11-unix/X0", 0);
int srv_len = sizeof(struct sockaddr_un);
connect(socketfd,(struct sockaddr*)&serv_addr, sizeof(serv_addr));
でも、私はwrite()
Sの束を行う必要があります、と私はシステムコールが高価であるため、ファイルのために、これは、バッファリングによるfwrite
より遅い多く、できることを知っています。ソケットで動作する同等の機能はありますか?バッファ付きIOをソケットで行うことも可能ですか? (ネヴァーマインドはfwrite
はあまりにもFILE*
ストリームを必要としていること、そして私が持っているすべての記述子です。)
はここ(write
を使用して)、そのようなリクエストを送信する機能の例です。
void x11_put_img(int socketfd, struct x11_connection* conn, uint8 format, uint32 target, uint32 gc, uint16 w, uint16 h, uint16 x, uint16 y, uint8 depth, uint32* data){
uint32 packet[6];
uint16 length = ((w*h)) + 6;
packet[0] = X11_OP_REQ_PUT_IMG | format<<8 | length<<16;
packet[1] = target;
packet[2] = gc;
packet[3] = w | h<<16;
packet[4] = x | y<<16;
packet[5] = depth<<8;
write(socketfd, packet, 24);
write(socketfd, data, (w*h)*4);
return;
}
(単純化のためのエラーチェック、。)
あなたはそれがうまくいくと思いますか分かりません。通常、ソケット経由で何かを送る場合は、次のコマンドを送る前に返信を期待します。バッファリングされた書き込みでは、バッファリングされた読み取りと何らかのメッセージキューイングもありました。それが本当にオーバーヘッドの価値があるかどうかはわかりません。 – Olaf
[writev](http://man7.org/linux/man-pages/man2/readv.2.html)? – rici