Sto lavorando su una libreria C ( SlipRock ) per la comunicazione tra processi.
La libreria attualmente espone una semplice API di blocco. Questo è facile da usare, rende l'uso improprio (relativamente) difficile (questo è C dopo tutto) e sarà (relativamente) facile da implementare su più piattaforme, una volta che mi metto a implementare la porta di Windows (che condivide essenzialmente senza codice comune) .
Tuttavia, temo che l'API di blocco possa causare problemi in determinati casi d'uso. Tuttavia, sono molto preoccupato di fornire un'API non bloccante che sia facile da usare e non richiedono l'uso di librerie pesanti come libuv o libevent.
I collegamenti alle lingue che naturalmente fanno pseudo-blocco (blocca il thread verde) I / O (come Go, Erlang o GHC Haskell) possono sempre implementare l'API di livello superiore (o anche l'intero protocollo - non lo è quel complesso) nella lingua di livello superiore. Allo stesso modo, è possibile implementare le parti del protocollo che non sono di tipo blocking (ascolto su un pipe named / socket AF_UNIX e connessione a un socket AF_UNIX, nonché il seguente scambio di password) nella lingua di livello superiore .
Devo fornire un'API C non bloccante o dovrei semplicemente fornire le 2 o 3 funzioni che i collegamenti dovrebbero utilizzare come base per l'API?
Il modo in cui stavo pensando di implementare l'API non bloccante consisteva nel disporre di una macchina a stati che l'utente è tenuto a richiamare manualmente. Ma ciò richiede che l'utente abbia accesso all'impugnatura IO sottostante - che è il valore di ritorno previsto! Quindi ho bisogno di interrompere l'incapsulamento o legarmi a un'implementazione del ciclo degli eventi se voglio esporre un'API asincrona per questo codice non molto performante.