Задание на лабораторную работу
- Изучить документацию к функциям fork (man fork), setsid (man setsid)
- Добавить возможность серверному приложению из предыдущего задания одновременно открывать несколько сессий.
- По желанию: обеспечить передачу сообщений между клиентами.
Приложение. Пример работы с сокетами
int listensocket,datasocket;
int pid;
signal (SIGCHLD, SIG_IGN); //auto-close child processes
/*
open and bind listensocket here
*/
if ((pid=fork())==-1)
{
globalerror(stderr,"Error: global fork");
exit(1);
}
if (pid) exit(0); //End parent
fclose(stdin); //Close standart input and output streams
fclose(stdout);
fclose(stderr);
setsid(); // De-attach terminal
if (listen(listensocket,5)==-1)
{
globalerror("Error: listen()");
exit(1);
}
while (1)
{
int addrlen;
bzero(&clnt_addr, sizeof(clnt_addr));
addrlen=sizeof(clnt_addr);
if ((datasocket=accept(s, (struct sockaddr *)&clnt_addr,
&addrlen))==-1) // accept new connection
{
globalerror("Error: accept()");
exit(1);
}
if ((pid=fork())==-1)
{
globalerror("Error: fork()");
exit(1);
}
if (pid==0) //Child
{
close(listensocket);
/*
some work here
*/
close(datasocket);
exit(0);
}
//Parent
close(datasocket);
}
}