Syscall BSD#28
svc · unix #28
sendmsg
Envoie un message accompagné de données de contrôle auxiliaires optionnelles via un tampon scatter-gather.
Prototype
int sendmsg(int s, caddr_t msg, int flags);Retour: int
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| s | int | - | |
| msg | caddr_t | - | |
| flags | int | - |
Historique des versions
| XNU tag | macOS | # |
|---|---|---|
| xnu-1456.1.26 | macOS 10.6 Snow Leopard | 28 |
| xnu-1486.2.11 | — | 28 |
| xnu-1504.15.3 | — | 28 |
| xnu-1504.3.12 | — | 28 |
| xnu-1504.7.4 | — | 28 |
| xnu-1504.9.17 | — | 28 |
| xnu-1504.9.26 | — | 28 |
| xnu-1504.9.37 | — | 28 |
Exemples
Pass a file descriptor over AF_UNIX
char buf[CMSG_SPACE(sizeof(int))] = {0};
struct iovec iov = { .iov_base = "x", .iov_len = 1 };
struct msghdr msg = { .msg_iov = &iov, .msg_iovlen = 1,
.msg_control = buf, .msg_controllen = sizeof(buf) };
struct cmsghdr *c = CMSG_FIRSTHDR(&msg);
c->cmsg_level = SOL_SOCKET; c->cmsg_type = SCM_RIGHTS;
c->cmsg_len = CMSG_LEN(sizeof(int));
*(int *)CMSG_DATA(c) = fd_to_pass;
sendmsg(sock, &msg, 0);Notes
Miroir de recvmsg côté émission. C'est le seul point d'entrée pouvant attacher SCM_RIGHTS (passage de descripteurs) sur AF_UNIX, fixer les adresses sources IP_PKTINFO ou transporter des cmsg NECP_CLIENT_PARAMETER qui lient un paquet UDP à un chemin Network.framework spécifique. msghdr.msg_flags est ignoré en entrée ; seuls iov, cmsg et la destination importent.
Détection
ES n'a aucun événement sendmsg. NEFilterDataProvider voit les octets de payload ; le passage de descripteurs via SCM_RIGHTS peut être déduit en comparant les instantanés PROC_PIDFDSOCKETINFO entre pairs.
API associées
sendtosendmsg_xrecvmsgsocketpairsetsockopt