daemon & serveur - C - Programmation
Marsh Posté le 13-03-2008 à 21:36:29
si c'était aussi simple. Le problème c'est que en fermant la console le processus s'en va aussi car il dépend directement de se dernier.
Marsh Posté le 13-03-2008 à 21:39:37
Faut imuniser le process au signal SIG_HUP, en utilisant la fonction signal().
Marsh Posté le 13-03-2008 à 21:39:54
ReplyMarsh Posté le 13-03-2008 à 21:46:58
Ben oui, moi si je ferme la fenetre putty et que je me reconnecte je n'ai plus de processus. ps aux|grep monprogramme, ben rien.
Marsh Posté le 13-03-2008 à 21:48:27
Qu'est ce que c'est cette fonction signal ?
Je le met où dans le main ?
Marsh Posté le 13-03-2008 à 22:02:08
Est ce quelqu'un pourra me dire si la solution est en utilisant fork() ?
Marsh Posté le 13-03-2008 à 20:41:08
Bonjour, j'ai fait un programme serveur en c sous linux mais le programme s'arrete lorsque je ferme la console. Que puis je faire pour eviter qu'il s'arrête ? Il y a t-il quelque chose à intégrer ?
Le code se présente sous cette forme (le programme marche bien):
(le serveur traite les données de chaque clients connectés)
static void app(void)
{
SOCKET sock = init_connection();
char buffer[BUF_SIZE];
int actual = 0;
int max = sock;
Client clients[MAX_CLIENTS];
fd_set rdfs;
while(1)
{
int i = 0;
FD_ZERO(&rdfs);
FD_SET(STDIN_FILENO, &rdfs);
FD_SET(sock, &rdfs);
for(i = 0; i < actual; i++)
{
FD_SET(clients[i].sock, &rdfs);
}
if(select(max + 1, &rdfs, NULL, NULL, NULL) == -1)
{
perror("select()" );
exit(errno);
}
if(FD_ISSET(STDIN_FILENO, &rdfs))
{
break;
}
else if(FD_ISSET(sock, &rdfs))
{
SOCKADDR_IN csin = { 0 };
size_t sinsize = sizeof csin;
int csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
if(csock == SOCKET_ERROR)
{
perror("accept()" );
continue;
}
if(read_client(csock, buffer) == -1)
{
continue;
}
max = csock > max ? csock : max;
FD_SET(csock, &rdfs);
Client c = { csock };
strncpy(c.name, buffer, BUF_SIZE - 1);
c.name[strlen(buffer)-1]=0;
if (accepter_client(c))
{
clients[actual] = c;
actual++;
write_client(c.sock,"connexion accepté\n" );
}
}
else
{
int i = 0;
for(i = 0; i < actual; i++)
{
if(FD_ISSET(clients[i].sock, &rdfs))
{
Client client = clients[i];
int c = read_client(clients[i].sock, buffer);
if(c == 0)
{
closesocket(clients[i].sock);
remove_client(clients, i, &actual);
strncpy(buffer, client.name, BUF_SIZE - 1);
strncat(buffer, " disconnected !", BUF_SIZE - strlen(buffer) - 1);
}
else
{
traiter_client(buffer);
}
break;
}
}
}
}
clear_clients(clients, actual);
end_connection(sock);
}