bonjours,
avant de commencer a ecrire j'ai trouve la solution de mon premier problem, mais je vais quand meme presenter le problem histoire de voir si on peut pas faire mieux:
j'ai un serveur S qui est sense recevoir un nom de programme et le lancer.
si vous faite telnet localhost PORT et
>a.out
le serveur execute fork et execv pour lancer a.out
le probleme que j'avais c'etait que si je ferme le serverur et que je le relance apres avoir lance a.out j'ai BIND error. j'avais vu que exec changeait le code du child mais j'avais oublie que les references au descripteurs listen et accept etaient aussi copier (niveau Kernel)
donc ma solution a ete de close les deux descripteurs dans les fils voici le codecode de spawn
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))<0) { fprintf(stderr,"Bind error \n"); return EXIT_FAILURE; } Listen(listenfd,G_BACKLOG); len=sizeof(client); connfd=accept(listenfd,(struct sockaddr*) &client,&len); //version simplifier ici desqu'il y a connection on lance l'application rien et on sort char * arg_list[]={"./rien","sortie.txt",NULL}; spawn("./rien",arg_list,connfd,listenfd);ca marche netstat me dit que le port est libere et l'application "rien" tourne sans probleme, je peux relancer le serveur sans probleme. quand je supprime l'un des closes le port est occupe par "rien" en LISTEN ou END_WAIT selon le descripteur ferme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 int spawn(char * program,char ** arg_list,int fd,int fd2) { pid_t child; child=fork(); if (child!=0) return child; else { close(fd); close(fd2); fprintf(stdout,"starting %s\n",program); execvp(program,arg_list); } }
donc mon probleme est resolut si il ya mieux merci de me le dire.
le nouveaux probleme:
j'aimerai utilise des thread pour gerer les differentes requetes, j'aimerai savoir alors dans ce cas ce qui va se passer d'un point de vu theorique quand les connections arrivent.
si T1 recois une connection il doit traiter le message recu et si il y a lieu faire le fork/execv pour lancer une application. mais comment fermer les descripteurs? lesquels seront vraiment ferme? est-ce que chaque thread a son propre descripteur ou est-ce une reference comme avec fork?
Partager