Я пытаюсь заполнить именованный канал (созданный mkfifo /tmp/pipe
), записывая в него 3 байта за раз, пока функциональные блоки write()
не будут.
В моей системе канал, по-видимому, ограничен 16 страницами по 4096 байт. Таким образом, канал может содержать 65536 байт.
Я делаю это с помощью следующего кода C:
int main ()
{
pid_t child;
child = fork ();
if (child == 0)
{
ssize_t ret;
ssize_t total = 0;
unsigned char *datat = malloc (65536);
assert (datat != NULL);
int fd = open ("/tmp/pipe", O_WRONLY);
assert (fd != -1);
while (1)
{
printf ("Trying writting\n");
ret = write (fd, datat, 3);
assert (ret != -1);
total += ret;
printf ("write : %ld.\n", total);
}
}
else
{
int fd = open ("/tmp/pipe", O_RDONLY);
assert (fd != -1);
while (1); //prevent closing the pipe.
}
return 0;
}
Таким образом, мне удается заполнить канал до 65520 байт. Я не понимаю, почему 65520, а не 65536 (или 65535, если учесть, что 65536 не кратно 3).
Затем я попытался записать 65520 байтов и после этого написать 3 байта:
int
main (int argc, char *argv[])
{
pid_t child;
child = fork ();
if (child == 0)
{
ssize_t ret;
ssize_t total = 0;
unsigned char *datat = malloc (65536);
assert (datat != NULL);
int fd = open ("/tmp/pipe", O_WRONLY);
assert (fd != -1);
while(1)
{
printf ("Trying writting\n");
ret = write (fd, datat, 65520);
assert (ret != -1);
total += ret;
printf ("Trying writting\n");
ret = write (fd, datat, 3);
assert (ret != -1);
total += ret;
printf ("write : %ld.\n", total);
}
}
else
{
int fd = open ("/tmp/pipe", O_RDONLY);
assert (fd != -1);
while (1); //prevent closing the pipe.
}
return 0;
}
Я ожидал, что вторая запись будет заблокирована, но это не так, и я написал 65523 байта.
Вопрос в том, почему я не могу записать более 65520 байтов в первом случае, тогда как я могу записать во втором?
EDIT:
Дополнительная информация:
int
main (int argc, char *argv[])
{
int fd = open ("/tmp/pipe", O_WRONLY);
printf ("MAX : %d\n", fcntl (fd, F_GETPIPE_SZ));
return 0;
}