Skip to content
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

NameTypeDirDescription
sint-
msgcaddr_t-
flagsint-

Historique des versions

XNU tagmacOS#
xnu-1456.1.26macOS 10.6 Snow Leopard28
xnu-1486.2.1128
xnu-1504.15.328
xnu-1504.3.1228
xnu-1504.7.428
xnu-1504.9.1728
xnu-1504.9.2628
xnu-1504.9.3728

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