Помогите пожалуйста, компилятор дает ошибку
/tmp/ccNa8DhL.o: In function `sig':
server.c:(.text+0x1b): undefined reference to `shm_unlink'
/tmp/ccNa8DhL.o: In function `main':
server.c:(.text+0x33c): undefined reference to `shm_open'
collect2: error: ld returned 1 exit status
gcc -lrt server.c
/*
Программа-сервер должна слушать на TCP-порту 8080.
Клиент подключается и вводит одну из двух команд в виде:
count
- получить общее число обработанных клиентов
time
- вывод времени сервера (unix-формат)
*/
#include <time.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define max_kolvo_client 5
#define max_kolvo_byte 256
#define shar_mem "kolvo_clients"
int flag = 1;
int Socket, Bind, Listen;
void sig(int a) // обработка исключения
{
printf("\n");
shm_unlink(shar_mem);
shutdown(Listen, SHUT_RDWR);
shutdown(Bind, SHUT_RDWR);
close(Socket);
exit(0);
}
// время сервера
void nowTime(char s[9])
{
struct tm *u;
time_t timer = time(NULL);
u = localtime(&timer);
sprintf(s, "%.2d:%.2d:%.2d\n", u->tm_hour, u->tm_min, u->tm_sec);
}
// "работа" сервера
void ServerSon(int cl, int *addr)
{
char str[max_kolvo_byte];
char time[9];
sprintf(str, "To finish write \"exit\"\n");
send(cl, str, strlen(str)+1, MSG_DONTROUTE);
int stop = 1;
while (stop)
{
int kolvo_simvolov = read(cl, str, max_kolvo_byte);
str[kolvo_simvolov] = '\0';
if (strcmp(str, "exit\n")==0) stop = 0;
else if (strcmp(str, "count\n")==0)
{
sprintf(str, "Кол-во обработанных клиентов = %d\n", *addr);
send(cl, str, strlen(str), MSG_DONTROUTE);
}
else if (strcmp(str, "time\n")==0)
{
nowTime(time);
sprintf(str, "%s", time);
send(cl, str, strlen(str), MSG_DONTROUTE);
}
else
{
sprintf(str, "Unknow command\n");
send(cl, str, strlen(str), MSG_DONTROUTE);
}
}
// разрыв соединения
shutdown(cl, SHUT_RDWR);
close(cl);
}
int main(int argc, char ** argv)
{
int shared_memory = shm_open(shar_mem, O_RDWR, 0);
if (shared_memory == -1) perror("shared_memory");
int *addr = mmap(0, sizeof(int), PROT_READ || PROT_WRITE, MAP_SHARED, shared_memory, 0);
if ( addr == (int*)-1 ) perror("mmap");
printf("Server started\n");
// подготовка сервера
Socket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in inet;
inet.sin_family = PF_INET;
inet.sin_addr.s_addr = htonl(INADDR_ANY);
inet.sin_port = htons(8080);
int opt = 1;
if (setsockopt (Socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) == -1) perror("setsockopt");
Bind = bind(Socket, (struct sockaddr *) &inet, sizeof(inet));
if (Bind<0) perror("Bind");
Listen = listen(Socket, max_kolvo_client);
if (Listen<0) perror("Listen");
signal(SIGINT, sig); // обрабатываем Ctrl^C, что бы закрыть соединение
while (flag)
{
// коннект клиентов
int cl = accept(Socket, NULL, NULL);
if (cl>0)
{
*addr++;
int k = fork(); // если есть коннект - обрабатываем клиента в отдельной нити
if (k == 0) ServerSon(cl, addr);
}
}
return 0;
}