Contrôle Final 2 – Année 2016/2017
- Durée du CF: 1h30
- Tous les documents sont autorisés
- Vous avez à votre disposition le code des fichiers serveur_code_etudiant.h et serveur_code_etudiant.c
Echauffement (5 points)
Pointeurs
Pour cet exercice, on s'intéresse à la liste struct list* client_list initialisée à la ligne 16, et modifiée par la fonction queue_add (ligne 95). On considère que cette liste est dans un état cohérent.
Pour chacune de ces expressions, indiquez si l'expression est valide, et si c'est le cas, le type de l'expression :
- *client
- client_list->next
- &client_list->client
- &client_list->client->client_conn
- client_list->client->fd
- *client est de type struct list
- client_list->next est de type struct list*
- &client_list->client est de type client_t**
- &client_list->client->client_conn est de type FILE**
- client_list->client->fd est de type int
/exec (8 points)
On souhaite ajouter la commande /exec qui permet de faire exécuter une commande shell par le serveur. Voici l'usage de la commande:
Par exemple, si un client envoie /exec ls, le serveur exécutera la commande ls.
Pour simplifier, on considère que la commande shell cmd ne prend pas d'argument.
(5 pt)
Implémentez la fonction void process_cmd_exec(client_t* client, char*param);. Cette fonction est appelée depuis handle_incoming_cmd lorsque le serveur reçoit la commande /exec.
La fonction process_cmd_exec doit créer un processus fils qui exécute la commande param passé en paramètre. Le processus père attend ensuite que le processus fils se termine. En cas d'erreur du processus fils, celui-ci envoie un message au client contenant le numéro de l'erreur (par exemple: cannot execute command: error 17). On considère que la commande ne prend pas de paramètre.
(3 pt)
On souhaite maintenant pouvoir exécuter des commandes en arrière-plan. Pour cela, les clients peuvent envoyer la commande /exec_bg au serveur. Cette commande est traitée par la fonction void process_cmd_exec_bg(client_t* client, char*param);, appelée par handle_incoming_cmd. Le traitement de la commande /exec_bg est similaire au traitement de /exec, à deux exceptions près :
- Le processus père n'attend pas la terminaison du processus fils, mais envoie le message "executing a command in bg: [PID]" (où PID est le PID du processus fils) au client ayant envoyé la commande.
- Le processus père, après avoir créé un processus fils, teste si l'un de ses processus fils s'est terminé. Si c'est le cas, il envoie un message à tous les clients: "bg command [PID] finished" (où PID est le PID du processus fils qui s'est terminé
Donnez le code de la fonction void process_cmd_exec_bg(client_t* client, char*param);