base all'incirca sui vostri commenti, si desidera qualcosa sulla falsariga di questa funzione:
/* return the fd or negative on error (check errno);
how is 1 if created, or 0 if opened */
int create_or_open (const char *path, int create_flags, int open_flags,
int *how) {
int fd;
create_flags |= (O_CREAT|O_EXCL);
open_flags &= ~(O_CREAT|O_EXCL);
for (;;) {
*how = 1;
fd = open(path, create_flags);
if (fd >= 0) break;
if (errno != EEXIST) break;
*how = 0;
fd = open(path, open_flags);
if (fd >= 0) break;
if (errno != ENOENT) break;
}
return fd;
}
Questa soluzione non è a prova di proiettile. Ci possono essere casi (collegamenti simbolici forse?) Che causerebbero un loop infinito. Inoltre, potrebbe attivare il live lock in determinati scenari di concorrenza. Lascerò risolvere questi problemi come un esercizio. :-)
Nella tua domanda modificato, si pongono:
ho 10 processi che tentano aprire lo stesso file più o meno allo stesso tempo utilizzando aperta chiamata (O_CREAT), quindi eliminare esso.
Un hack-ish, ma più a prova di proiettile, la soluzione sarebbe quella di dare a ciascun processo un ID utente diverso. Quindi, usa semplicemente la normale chiamata open(path, O_CREAT|...)
. È quindi possibile interrogare il file con fstat()
sul descrittore di file e controllare il campo st_uid
della struttura stat
. Se il campo è uguale all'ID utente dei processi, è stato il creatore. Altrimenti, era un apripista. Funziona poiché ogni processo cancella il file dopo l'apertura.
Utilizzare '(O_CREAT | O_EXCL)' per ottenere un errore se il file esiste già. Quando si verifica l'errore, si controlla l'errore "errno" per vedere se è perché esiste, quindi riaprire comunque se si desidera aprirlo, sapendo che esiste già. – jxh
E poi fare cosa? Ma cosa succede se un altro processo lo apre dopo il mio controllo ma prima che il mio "riapri comunque"? – Sergey
Il tuo problema nella descrizione non è completamente specificato allora. Aggiorna la tua domanda con il problema reale che stai affrontando. Mostra del codice e indica dove qualcosa non sta accadendo nel modo in cui ti aspetti. – jxh