Ayant à l'esprit de communiquer avec une socket de domaine Unix multi-client sans saisie au clavier, je souhaite créer un descripteur de fichier qui remplace stdin.Créer un descripteur de fichier qui remplace stdin (dans select())
Avec une prise multi-client, vous devez ajouter le descripteur de fichier stdin (qui est 0, avec FD_SET(0, &readfds)
) à readfds afin d'envoyer l'entrée du clavier (FD_ISSET(0, &readfds)
) au serveur. Comme je ne veux pas écrire à chaque fois que je lance mon client, je veux remplacer ce descripteur par un fichier personnalisé (en écrivant dans ce fichier à partir d'un autre programme).
J'ai vérifié Create a file descriptor pour créer deux programmes:
Celui qui écrit au descripteur de fichier:
int main() {
char buffer[] = "test";
int fd = open("sample.dat", O_WRONLY | O_CREAT, 0666);
dup2(fd, 5);
if(write(5, buffer, 4) < 0)
fprintf(stderr, "write %s\n", strerror(errno));
close(5);
return 0;
}
Et un autre qui lit de lui:
int main() {
char buffer[4];
int fd = open("sample.dat", O_RDONLY);
dup2(fd, 5);
for(;;) {
if(read(5, buffer, 4) < 0)
fprintf(stderr, "read %s\n", strerror(errno));
printf("%s\n", buffer);
sleep(1);
}
return 0;
}
Ma question est: est-il possible de rendre ce descripteur de fichier comme stdin-like? Je veux dire en fait mon deuxième programme a lu "test" indéfiniment parce que (bien sûr) sample.dat contient toujours "test" mais je veux le supprimer une fois qu'il a été lu.
Ce que vous demandez n'est pas très clair: qu'entendez-vous par "stdin-like"? –
@ChrisTurner quand vous lisez quelque chose de stdin vous ne le lisez qu'une seule fois, pas infiniment parce que stdin "supprime"/"nettoie" (je ne sais pas exactement comment ça marche) une fois qu'il a été lu – Rallph