Является ли ошибкой использование msg_accrights для отправки & fd между процессами? - PullRequest
0 голосов
/ 25 мая 2011

Цитируется здесь :

    msg.msg_accrights = (caddr_t) &ch->fd;
    msg.msg_accrightslen = sizeof(int);
    ...
    n = sendmsg(s, &msg, 0);

IMHO &ch->fd не может быть разделен между процессами (адрес fd не будет доступен в другом процессе), следует передать ch->fd напрямую,

я прав?

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Вы не отправляете адрес фд. Вы отправляете массив (с 1 элементом в данном случае). Так как отправляется только один fd, используется адрес самого дескриптора файла, так как на самом деле нет разницы между выполнением этого и выполнением:

int fds[1];
fds[1] = ch->fd;
msg.msg_accrights = (caddr_t) fds;
msg.msg_accrightslen = sizeof fds;

sendmsg отправит значение этого массива, поэтому другой конец получит значение дескриптора файла, а не адрес дескриптора файла.

0 голосов
/ 25 мая 2011

msg_accrights указывает на массив файловых дескрипторов, поэтому код корректен при передаче одного файлового дескриптора.

Общая форма этого вызова выглядит примерно так:

int fds[2];
fds[0] = an_fd;
fds[1] = another_fd;
msg.msg_accrights = (caddr_t) fds;
msg.msg_accrightslen = sizeof fds;
...
n = sendmsg(s, &msg, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...