Повторно используйте буфер vmsplice, когда он не передается ядру

#c #linux #splice

Вопрос:

Я пытаюсь понять, как vmsplice это работает, особенно когда дело доходит до повторного использования буфера. В приведенном ниже примере я не передал флаг, поэтому обычно vmsplice должен блокироваться, и ядро не «одарено» буфером. Однако, когда спящий режим закомментирован, вывод становится полностью неупорядоченным. Что я упускаю?

 #define _GNU_SOURCE  #include lt;bits/types/struct_iovec.hgt; #include lt;fcntl.hgt; #include lt;unistd.hgt;  int main() {  char buffer[2] = "0n";  struct iovec iov;  iov.iov_base = buffer;  iov.iov_len = 2;  while (1) {  buffer[0] = (buffer[0] - '0'   1) % 10   '0';  vmsplice(1,amp;iov,1,0);  // When the sleep is commented, output becomes unordered.  sleep(1);  } }  

запустите код как:

 gcc example.c ./a.out | cat #The pipe is mandatory for vmsplice