Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Bug dans environnement linux
Envoyé par: Calou

Salut a tous,
J'espere que vous pourrez m'aider.
Je pense avoir trouver un bug dans l'environnement linux noyau au moins (2.4.18 et 2.4.20)
Vous savez tous que l'on peut redefinir un fd (comme stdin) comme non bloquant.
Exemple :
flags_stdin = fcntl(fileno(stdin),F_GETFL,0);
fcntl(fileno(stdin), F_SETFL,flags_stdin | O_NONBLOCK);

Le bug est le suivant : stdin prend bien l'attribut O_NONBLOCK mais le probleme est que des file descripteurs stdout et stderr le prennent egalement.

Donc si derriere lance des printf un peu trop long (c'est a dire tant que le scheduler donne la main au process) les printf ne sont pas tous affiches.

pour mettre en evidence le probleme j'ai fait un petit programme de test :
Je suis desole mais c'est du vite fait. Si vous ne comprennez pas l'histoire des printf
Vous avez qu'a placer une tirade de printf a l'endroit indiquer. Ils ne s'afficheront pas tous.

Ceci dit ce petit programme met en evidence que le flag O_NONBLOCK place dans STDIN est diffuse dans STDOUT et STDERR.

J'ai execute ce programme sur :
- un noyau 2.2.18 (sur ce noyau pas de bug)
- sur un SUN Os ( pas de bug egalement)

-------------------------------------------------debut programme

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
int fd = open("essai.cpp", O_RDONLY);

//------- Print stdout O_NONBLOCK bit
printf("stdout O_NONBLOCK bit is %d\n",
fcntl(STDOUT_FILENO, F_GETFL, 0) & O_NONBLOCK ? 1 : 0);

//------- Print stderr O_NONBLOCK bit
printf("stderr O_NONBLOCK bit is %d\n",
fcntl(STDERR_FILENO, F_GETFL, 0) & O_NONBLOCK ? 1 : 0);

//------- Print fd O_NONBLOCK bit
printf("fd O_NONBLOCK bit is %d\n",
fcntl(fd, F_GETFL, 0) & O_NONBLOCK ? 1 : 0);


//------- Set stdin O_NONBLOCK bit
fcntl(0, F_SETFL,fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK);

// placer les printf ici si vous voulez faire le test

//------- Print stdout O_NONBLOCK bit again
printf("stdout O_NONBLOCK bit is %d\n",
fcntl(STDOUT_FILENO, F_GETFL, 0) & O_NONBLOCK ? 1 : 0);

//------- Print fd O_NONBLOCK bit again
printf("fd O_NONBLOCK bit is %d\n",
fcntl(fd, F_GETFL, 0) & O_NONBLOCK ? 1 : 0);

//------- Print stderr O_NONBLOCK bit again
printf("stderr O_NONBLOCK bit is %d\n",
fcntl(STDERR_FILENO, F_GETFL, 0) & O_NONBLOCK ? 1 : 0);

close(fd);
return 0;
}
------------------------------------------------ fin programme

Poste le Tuesday 2 December 2003 14:56:48
Répondre     Citer    
Re: Bug dans environnement linux
Envoyé par: Calou

Autant pour moi, je suis le blaireau de service....
Pour l'utilisation de fcntl la commande F_GETFL veut dire que la modification de style est faite dans l'arbre des fd.
Pour affecter la modif sur un seul fd il faut utiliser F_GETFD

Désolé pour vous avoir embrouillé.

Je repart la queue entre les jambes....

Poste le Thursday 4 December 2003 11:12:44
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Bug dans environnement linux
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons