C: Régler le problème des defunct process

Lorsque vous développez une application, il est parfois très intéressant d’utiliser des threads ou plusieurs processus pour exécuter plusieurs tâches simultanément. Nous allons ici voir un problème qui arrive lors que l’on utilise plusieurs processus, via un fork(). En effet, en C, la fonction fork permet de créer un nouveau processus, qui devient fils du processus appelant le fork.

Processus zombies (defunct)

Par défaut, lorsque le processus père s’arrête, tous les processus fils s’arrête. À l’inverse, lorsqu’un processus fils s’arrête – via un exit(0); par exemple -, sa mémoire est libérée, il devient un processus zombie (seul le bloc de contrôle reste présent) et le processus père continue de fonctionner.

Ainsi, l’on peut voir de nombreuses lignes marquées par un defunct lorsque l’on liste les processus avec un ps:

C’est parce que le processus père n’écoutes pas le signal SIGCHLD, qui est envoyé par le fils lors de son extinction. Ainsi, en écoutant le signal, le père peut libérer son bloc de contrôle. En C, c’est la fonction waitpid qui nous sera utile.

Une ligne à ajouter

Il n’y a qu’une seule ligne (ainsi qu’un #include) à ajouter à votre code C pour que les processus zombies soient “ramassés” par votre processus père. De temps en temps – l’idéal étant la boucle principale s’il y a -, exécutée cette ligne ci:

Les arguments sont les suivants:

  • WAIT_ANY est la constante permettant de dire que l’on souhaite attendre n’importe quel des processus fils de ce processus. À la place, nous aurions pu mettre le pid d’un processus particulier.
  • NULL permet de ne pas récupérer d’informations de statut du processus.
  • WNOHANG est une option permettant d’exécuter waitpid en mode non-bloquant.

N’oubliez pas d’inclure l’en-tête des fonctions et constantes ainsi:

Ainsi, il ne restera plus de processus zombie, ou defunct.

facebooktwittergoogle_plusredditpinterestlinkedinmail

MyOnlineSSH: Mise à jour

Le service MyOnlineSSH a été mis à jour. Pour rappel, lors de mon précédent article sur MyOnlineSSH, je vous présentait ce service comme un client SSH Web: vous pouvez vous connecter sur un serveur SSH et utiliser votre navigateur comme terminal, ce qui est extrêmement pratique lorsque vous êtes à un endroit où vous pouvez pas utiliser le port 22 à l’exterieur de votre réseau, et que vous ne souhaitez pas mettre en place un tunnel HTTP par exemple.

Change-log

  • Le Flash Player n’est maintenant plus requis, seules des requêtes GET et POST sont envoyées.
  • Vous pouvez créer plusieurs terminaux simultanés
  • Rapidité beaucoup plus importante.

Si vous avez une quelconque suggestion ou question, n’hésitez pas à me contacter ou à laisser un commentaire sur cet article.

facebooktwittergoogle_plusredditpinterestlinkedinmail

socket_stream_select: Attendre un flux (stream) et un socket en même temps

Avec PHP, on peut interagir avec l’extérieur (et l’intérieur) du serveur sur lequel est exécuté le PHP à l’aide de flux et de sockets. Pour PHP, les flux – ou streams – et les sockets sont différents, alors qu’au niveau système, ce sont en réalité tous les deux des sockets (différents des sockets tels que l’entend PHP).

L’on travaille sur les deux en utilisant des fonctions toutes distinctes:

Parmi celles-ci, il y a deux fonctions extrêmement utiles: stream_select et socket_select. Elles permettent d’attendre de nouvelles données respectivement depuis un flux et un socket.

Vous pouvez par exemple attendre deux flux de données en même temps avec stream_select. Si l’un des deux a de nouvelles informations, la fonction retourne un entier décrivant le nombre de flux qui ont eu de nouvelles notifications. Vous pouvez aussi ajouter un timeout, etc… De la même manière, vous pouvez attendre un ou plusieurs sockets avec socket_select.

Seulement, si vous travaillez à la fois avec des flux et des sockets… Comment faire?

  1. Vous pouvez très bien mettre des timeout à quelques dizaines de millisecondes, regarder pendant x ms le flux, x ms le socket, puis on recommence… C’est une solution comme une autre mais très peu propre, et qui ne sera jamais “instantanée”.
  2. Vous pouvez utiliser un système, auquel vous vous connecterez en socket, qui écoutera un flux et dès que le flux recevra des données, il vous l’enverra par le socket. Ainsi, vous aurez que des sockets, vous pouvez donc utiliser socket_select.
  3. Mais, pourquoi ne pas créer une fonction socket_stream_select, ou stream_socket_select, comme vous voulez, dans le coeur de PHP, qui transformera les flux et les sockets PHP en sockets systèmes pour les écouter avec la fonction C select ?

Continue reading socket_stream_select: Attendre un flux (stream) et un socket en même temps

facebooktwittergoogle_plusredditpinterestlinkedinmail

MyOnlineSSH: Connectez-vous en SSH depuis un simple navigateur Internet

Vous pouvez aussi voir la page du projet MyOnlineSSH.

MyOnlineSSH est un service permettant de se connecter à un serveur en SSH directement depuis votre navigateur. La configuration necessaire est très petite:

  • Un navigateur avec le JavaScript activé
  • Flash Player installé
  • Le port 80 ouvert

En effet, seul le port 80 suffit pour se connecter au SSH à l’aide de MyOnlineSSH comme vous pouvez le voir dans la page Aide de MyOnlineSSH.

Je vous invite donc à tester dès à présent MyOnlineSSH:

http://www.myonlinessh.com

D’ici peu, une traduction anglaise de MyOnlineSSH verra le jour pour nos amis anglophones.

facebooktwittergoogle_plusredditpinterestlinkedinmail

Debian/Ubuntu: Changer la résolution de la console

Attention, ne marche qu’avec la version 1 de GRUB – c’est-à-dire pour les versions d’Ubuntu antérieures à la 9.10.

Avoir un petit ordinateur annexe qui sert de serveur c’est bien, ne pas en avoir – ou vouloir utiliser des solutions plus portables – c’est moins pratique. Pour ça, on peut utiliser des Debian virtualisés avec VirtualBox par exemple. Néanmoins, on ne peut pas se connecter à distance sur les consoles de ces machines virtualisées depuis l’hôte. On est donc obligés d’utiliser le système d’exploitation, sans interface graphique, en mode console. Seulement, la console est parfois très petite, on peut donc facilement changer la résolution de celle-ci.
Continue reading Debian/Ubuntu: Changer la résolution de la console

facebooktwittergoogle_plusredditpinterestlinkedinmail

Quelle version de Debian ?

Après plusieurs mises à jours, des serveurs différents qui ne sont pas construits pareils (ils n’ont pas la même fonction), etc.. c’est parfois dur de se rappeler sur quelle version de Debian tel ou tel serveur est-il installé.. Ainsi, pour connaitre la version de votre système Debian (et ses dérivées comme Ubuntu, Kubundu..) en console, il vous suffit de faire:

Chez moi, voilà la réponse:

facebooktwittergoogle_plusredditpinterestlinkedinmail

Ubuntu: Installer un nouveau kernel

Pour installer un nouveau kernel dans Ubuntu, plus besoin de s’embêter avec la compilation, kernel.ubuntu.com propose les kernels en fichiers .deb compilés avec les options par défaut de toutes les versions d’Ubuntu.

Ainsi, téléchargez tous les fichiers pour votre système (i386 – 32bits – ou amd64 – 64 bits) de la version du kernel que vous voulez dans un dossier à cette adresse:

http://kernel.ubuntu.com/~kernel-ppa/mainline/

Ensuite, dans le console, placez-vous dans le dossier dans lequel vous avez télécharger les fichiers .deb puis exécutez:

Le nouveau noyau est installé et est automatiquement placé par défaut dans grub.

facebooktwittergoogle_plusredditpinterestlinkedinmail

Ubuntu/Debian: Formatage bas niveau

Vous avez peut-être déjà entendu parler du formatage bas niveau. C’est un formatage qui remet le disque dur dans un “état constructeur”, c’est-à-dire où tous les inodes sont à zéro. Sous Windows, on ne peut pas vraiment formatter un disque dur jusqu’a ce point, il faut utiliser des logiciels issus du constucteur du disque dur. Ceux-ci re-créés en général la table de partition.

Sous Debian et ses dérivées, c’est très simple grâce à la commande dd. Ainsi vous pouvez copier tous les inodes d’un périphérique – device – sur un autre. Or, on sait que le périphérique défini par /dev/zero est un périphérique virtuel qui contient que des zéros, donc on va mettre le contenu de celui-ci dans notre disque dur…

Pour récupérer le nom de code (c’est-à-dire le xxx de /dev/xxx) de votre disque dur, faites:

Continue reading Ubuntu/Debian: Formatage bas niveau

facebooktwittergoogle_plusredditpinterestlinkedinmail

Utiliser une clé d’identification spécifique avec svn

Utiliser les clés d’identification publique/privée peut être très utile pour ne pas à avoir à spécifier le mot de passe de tel ou tel compte à chaque fois que l’on souhaite se connecter. Seulement, comme pour le système SVN d’OVH, les clés sont utilisées pour exécuter une commande, ici, “/usr/bin/svnserve”, ce qui permet en quelques sortes de transformer le tunnel SSH en une connexion SVN.

Le problème, c’est lorsque l’on a plusieurs clés sur un serveur/ordinateur et que l’on veux utiliser une clé spécifique pour la connexion SVN+SSH. Pour cela, il faut tout simplement modifier une variable système via”export” :

Continue reading Utiliser une clé d’identification spécifique avec svn

facebooktwittergoogle_plusredditpinterestlinkedinmail

Linux: Créer des RAM Disks

Dans le domaine du developpement informatique, le temps de réponse est une question critiale qui amène parfois à repenser totalement ses systèmes. Dans certains cas, le temps de réponse et limité par le processeur et la mémoire RAM, mais parfois, plus souvent qu’on ne le croit, il peut être significativement réduit avec des optimisations lors de la lecture des données.

Les RAM Disks sont des petits espaces de la mémoire RAM que l’on réserve pour stocker des données dans la mémoire RAM ! Cette méthode de stockage peut augementer les temps de lectures pour notament pour : Continue reading Linux: Créer des RAM Disks

facebooktwittergoogle_plusredditpinterestlinkedinmail