Strona 1 z 2
Funkcja, która uruchamia serwer jako demon?
: 09 września 2010, 16:43
autor: fender666
Witajcie po długiej przerwie.
Mam nie lada problem, lecz zaczynając od początku, mam do napisania program w C działający pod Linuksem. Program ma postać klient-serwer, całość wykorzystuje gniazda strumieniowe. Program działa super i w jak najlepszym porządku lecz rodzi mi się pytanie, zamiast za każdym razem uruchamiać go w tle poleceniem:
chciałbym aby przez jakąś funkcje uruchamiał się jako demon. Znalazłem w Google bardzo ciekawą funkcje ale naprawdę kombinowałem na wszystkie sposoby nie wiem jak jej użyć, czy ktoś może mi z Was pomoc i podpowiedzieć, jak to powinno wyglądać, jak będzie potrzeba wrzucę kody źródłowe skryptu.
Znalazłem również link do tej funkcji, z którą się tak długo męczyłem.
http://linux.about.com/library/cmd/blcmdl3_daemon.htm
: 09 września 2010, 19:13
autor: lessmian2
Skoro aplikacja ma działać jako demon, to od razu się ją tak pisze, a nie wymyśla jak ją uruchomić w tle
Tworzysz proces potomny który będzie głównym procesem demona, ustawiasz mu
SIDa, ew. robisz
chdir do odpowiedniego katalogu i zamykasz deskryptory do
STDIN,
STDOUT i
STDERR. Tu masz krótkie howto dla demona w C ->
LINK
: 09 września 2010, 19:24
autor: fender666
lessmian2 pisze:Skoro aplikacja ma działać jako demon, to od razu się ją tak pisze, a nie wymyśla jak ją uruchomić w tle. Tworzysz proces potomny, który będzie głównym procesem demona, ustawiasz mu
SIDa, ewentualnie robisz
chdir do odpowiedniego katalogu i zamykasz deskryptory do
STDIN,
STDOUT i
STDERR. Tu masz krótki poradnik dla demona w C ->
LINK
Spoko dziękuje za odpowiedź, więc rozumiem, a czy mogę teraz wszystkie moje funkcje wraz z definicjami itd przenieść po prostu do tego programu
??Dzięki za zainteresowanie tematem. Pozdrawiam.
P.S. A może znalazłby się ktoś kto by mi to scalił w całość? A i jeszcze jedna rzecz, próbowałem skompilować ten skrypt, który mi dałeś w tym linku i niestety wyskoczyły mi błędy.
Całość kompilowałem poleceniem:
Kod: Zaznacz cały
daemon.c:17:24: sys /types.h: Nie ma takiego pliku ani katalogu
daemon.c:18:16: warning: extra tokens at end of #include directive
daemon.c:18:29: /sys: Nie ma takiego pliku ani katalogu
daemon.c:19:20: stdio .h: Nie ma takiego pliku ani katalogu
daemon.c:20:21: stdlib .h: Nie ma takiego pliku ani katalogu
daemon.c:21:20: fcntl .h: Nie ma takiego pliku ani katalogu
daemon.c:22:20: errno .h: Nie ma takiego pliku ani katalogu
daemon.c:23:21: unistd .h: Nie ma takiego pliku ani katalogu
daemon.c:24:21: syslog .h: Nie ma takiego pliku ani katalogu
daemon.c:25:21: string .h: Nie ma takiego pliku ani katalogu
daemon.c:26:21: assert .h: Nie ma takiego pliku ani katalogu
daemon.c:27:21: signal .h: Nie ma takiego pliku ani katalogu
daemon.c: In function `signal_handler':
daemon.c:74: error: `SIGHUP' undeclared (first use in this function)
daemon.c:74: error: (Each undeclared identifier is reported only once
daemon.c:74: error: for each function it appears in.)
daemon.c:75: error: `LOG_WARNING' undeclared (first use in this function)
daemon.c:77: error: `SIGTERM' undeclared (first use in this function)
daemon.c: In function `main':
daemon.c:109: error: `SIGHUP' undeclared (first use in this function)
daemon.c:110: error: `SIGTERM' undeclared (first use in this function)
daemon.c:111: error: `SIGINT' undeclared (first use in this function)
daemon.c:112: error: `SIGQUIT' undeclared (first use in this function)
daemon.c:131: error: `LOG_INFO' undeclared (first use in this function)
daemon.c:135: error: `LOG_DEBUG' undeclared (first use in this function)
daemon.c:136: error: `LOG_CONS' undeclared (first use in this function)
daemon.c:136: error: `LOG_NDELAY' undeclared (first use in this function)
daemon.c:136: error: `LOG_PERROR' undeclared (first use in this function)
daemon.c:136: error: `LOG_PID' undeclared (first use in this function)
daemon.c:137: error: `LOG_USER' undeclared (first use in this function)
daemon.c:144: error: `pid_t' undeclared (first use in this function)
daemon.c:144: error: syntax error before "pid"
daemon.c:150: error: `pid' undeclared (first use in this function)
daemon.c:152: error: `EXIT_FAILURE' undeclared (first use in this function)
daemon.c:157: error: `EXIT_SUCCESS' undeclared (first use in this function)
daemon.c:164: error: `sid' undeclared (first use in this function)
daemon.c:177: error: `STDIN_FILENO' undeclared (first use in this function)
daemon.c:178: error: `STDOUT_FILENO' undeclared (first use in this function)
daemon.c:179: error: `STDERR_FILENO' undeclared (first use in this function)
A żeby nie latać po stronach wrzucam również kod tego skryptu:
http://pastie.org/1148507
: 09 września 2010, 20:59
autor: widmo17
Usuń spacje przy dołączaniu bibliotek (masz teraz #include <stdio .h>, powinno być #include <stdio.h> i tak dla każdej biblioteki).
: 09 września 2010, 22:51
autor: fender666
widmo17 pisze:Usuń spacje przy dołączaniu bibliotek (masz teraz #include <stdio .h>, powinno być #include <stdio.h> i tak dla każdej biblioteki).
Super, dziękuję. Nie zauważyłem, ale mimo wszystko jak już skompilowałem i uruchomiłem całość tak:
to po użyciu polecenia:
niestety skrypt daemon nie widnieje na liście procesów, dlaczego?
: 10 września 2010, 05:47
autor: lessmian2
Skoro piszesz sam programy w C (a tak napisałeś), to nie wiesz co robi program podany przeze mnie w linku? Widnieje jak wół w źródłach TODO: Insert core of your daemon processing here. Ten program tworzy proces potomny (demona) i się kończy. Wstaw tam testowo jakąś wieczną pętlę, to zobaczysz go na liście procesów. A docelowo wstaw tam swój kod.
: 10 września 2010, 13:11
autor: fender666
lessmian2 pisze:Skoro piszesz sam programy w C (a tak napisałeś), to nie wiesz co robi program podany przeze mnie w linku? Widnieje jak wół w źródłach TODO: Insert core of your daemon processing here. Ten program tworzy proces potomny (demona) i się kończy. Wstaw tam testowo jakąś wieczną pętlę, to zobaczysz go na liście procesów. A docelowo wstaw tam swój kod.
Niestety wstawiłem swój kod tak jak powiedziałeś i nic. Wszystko się ładnie kompiluje, a procesu jak nie było tak nie ma. Masz jeszcze jakieś propozycje jak to zrobić?
: 10 września 2010, 16:30
autor: widmo17
Kod: Zaznacz cały
#include <stdlib.h>
int main() {
daemon(0);
while(1){}
}
Skompiluj, uruchom i postaraj się wyciągnąć wnioski.
: 10 września 2010, 18:09
autor: fender666
widmo17 pisze:Kod: Zaznacz cały
#include <stdlib.h>
int main() {
daemon(0);
while(1){}
}
Skompiluj, uruchom i postaraj się wyciągnąć wnioski.
Zgodnie z tym co mi napisałeś skompilowałem, wyskoczyły mi błędy, że funkcja ,,daemon'' potrzebuje dwóch argumentów i tak jak jest w tym odnośniku. Co ją wrzuciłem, uruchamiałem tą funkcję w takiej postaci:
Niestety też nie zadziałało co to może być?
: 10 września 2010, 22:27
autor: widmo17
Kompilowałem ten programik pod Debianem Lenny przy pomocy gcc, dokładnie taki jak jest wklejony, z jednym argumentem i działało idealnie.