Quindi ho letto molte informazioni su dati ausiliari unix-stream, ma una cosa che manca in tutta la documentazione è cosa dovrebbe succedere quando c'è una lettura parziale?
Supponiamo che sto ricevendo i seguenti messaggi in un buffer di 24 byte
msg1 [20 byes] (no ancillary data)
msg2 [7 bytes] (2 file descriptors)
msg3 [7 bytes] (1 file descriptor)
msg4 [10 bytes] (no ancillary data)
msg5 [7 bytes] (5 file descriptors)
La prima chiamata a recvmsg, ottengo tutto msg1 (e parte di msg2? Il sistema operativo lo farà mai?) Se ricevo parte di msg2, ottengo subito i dati accessori e devo salvarli per la lettura successiva quando so cosa mi stava effettivamente dicendo il messaggio con i dati? Se libererò i 20 byte da msg1 e poi richiamerò di nuovo recvmsg, consegnerà mai msg3 e msg4 contemporaneamente? I dati ausiliari di msg3 e msg4 vengono concatenati nella struttura del messaggio di controllo?
Mentre potrei scrivere programmi di test per scoprirlo sperimentalmente, sto cercando documentazione su come si comportano i dati accessori in un contesto di streaming. Sembra strano che non riesca a trovare nulla di ufficiale su di esso.
Aggiungerò qui i miei risultati sperimentali, che ho ottenuto da questo programma di test:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
Linux 3.2.59, 3.17.6
Sembra che Linux aggiungerà parti di messaggi portanti accessori alla fine di altri messaggi purché non sia necessario consegnare alcun payload ausiliario precedente durante questa chiamata a recvmsg. Una volta consegnati i dati ausiliari di un messaggio, verrà restituita una lettura breve anziché avviare il successivo messaggio di dati ausiliari. Quindi, nell'esempio sopra, le letture che ottengo sono:
recv1: [24 bytes] (msg1 + partial msg2 with msg2's 2 file descriptors)
recv2: [10 bytes] (remainder of msg2 + msg3 with msg3's 1 file descriptor)
recv3: [17 bytes] (msg4 + msg5 with msg5's 5 file descriptors)
recv4: [0 bytes]
BSD 4.4, 10.0
BSD fornisce un maggiore allineamento rispetto a Linux e fornisce una breve lettura immediatamente prima dell'inizio di un messaggio con dati ausiliari. Tuttavia, aggiungerà felicemente un messaggio non secondario alla fine di un messaggio secondario. Quindi, per BSD, sembra che se il buffer è più grande del messaggio secondario, si ottiene un comportamento simile a un pacchetto. Le letture che ottengo sono:
recv1: [20 bytes] (msg1)
recv2: [7 bytes] (msg2, with msg2's 2 file descriptors)
recv3: [17 bytes] (msg3, and msg4, with msg3's 1 file descriptor)
recv4: [7 bytes] (msg5 with 5 file descriptors)
recv5: [0 bytes]
FARE:
Mi piacerebbe ancora sapere come accadrà su Linux, iOS, Solaris, ecc. Precedenti e come ci si potrebbe aspettare che accada in futuro.