從here引用:使用msg_accrights在進程之間發送&fd是否存在缺陷?
msg.msg_accrights = (caddr_t) &ch->fd;
msg.msg_accrightslen = sizeof(int);
...
n = sendmsg(s, &msg, 0);
IMHO &ch->fd
不能處理(的fd
地址將不會在另一過程可用),應轉移ch->fd
直接在...之間被共享,
是嗎?
從here引用:使用msg_accrights在進程之間發送&fd是否存在缺陷?
msg.msg_accrights = (caddr_t) &ch->fd;
msg.msg_accrightslen = sizeof(int);
...
n = sendmsg(s, &msg, 0);
IMHO &ch->fd
不能處理(的fd
地址將不會在另一過程可用),應轉移ch->fd
直接在...之間被共享,
是嗎?
你是不是發送FD的地址。你正在發送一個數組(在這種情況下有1個元素)。由於只有一個fd被髮送後,文件描述符本身的地址被使用,真的是有這樣做和做之間沒有什麼區別:
int fds[1];
fds[1] = ch->fd;
msg.msg_accrights = (caddr_t) fds;
msg.msg_accrightslen = sizeof fds;
SENDMSG將發送陣列的價值,所以另一端將收到文件描述符的值,而不是文件描述符的地址。
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);
我很困惑..做'sendmsg'最後發送fd('&fd')或fd的地址嗎? – 2011-05-25 14:41:56
出於您的目的,它會發送地址,該地址應該指向由'msg_accrightslen'給出長度的'fd'數組。這意味着如果您想傳輸多個文件描述符,則不需要進行多次'sendmsg()'調用,只需指定一個數組即可。我會註解答案。 – geekosaur 2011-05-25 14:45:09
很高興知道它發送的價值,而不是地址:) – 2011-05-25 14:51:05