Funkcja, która uruchamia serwer jako demon?

Potrzebujesz pomocy z C, C++, perl, python, itp.
fender666
Beginner
Posty: 114
Rejestracja: 21 marca 2008, 22:55
Lokalizacja: Kutno

Funkcja, która uruchamia serwer jako demon?

Post 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:

Kod: Zaznacz cały

./serwer &
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
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post 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
fender666
Beginner
Posty: 114
Rejestracja: 21 marca 2008, 22:55
Lokalizacja: Kutno

Post 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

gcc -o daemon daemon.c

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
Awatar użytkownika
widmo17
Posty: 58
Rejestracja: 26 października 2008, 18:54
Lokalizacja: irc.freenode.net #bimbrownia.org

Post autor: widmo17 »

Usuń spacje przy dołączaniu bibliotek (masz teraz #include <stdio .h>, powinno być #include <stdio.h> i tak dla każdej biblioteki).
fender666
Beginner
Posty: 114
Rejestracja: 21 marca 2008, 22:55
Lokalizacja: Kutno

Post 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:

Kod: Zaznacz cały

./daemon
to po użyciu polecenia:

Kod: Zaznacz cały

ps -aux
niestety skrypt daemon nie widnieje na liście procesów, dlaczego?
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post 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.
fender666
Beginner
Posty: 114
Rejestracja: 21 marca 2008, 22:55
Lokalizacja: Kutno

Post 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ć?
Awatar użytkownika
widmo17
Posty: 58
Rejestracja: 26 października 2008, 18:54
Lokalizacja: irc.freenode.net #bimbrownia.org

Post autor: widmo17 »

Kod: Zaznacz cały

#include <stdlib.h>
int main() {
        daemon(0);
        while(1){}
}
Skompiluj, uruchom i postaraj się wyciągnąć wnioski.
fender666
Beginner
Posty: 114
Rejestracja: 21 marca 2008, 22:55
Lokalizacja: Kutno

Post 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:

Kod: Zaznacz cały

daemon(0,0);
Niestety też nie zadziałało co to może być?
Awatar użytkownika
widmo17
Posty: 58
Rejestracja: 26 października 2008, 18:54
Lokalizacja: irc.freenode.net #bimbrownia.org

Post 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.
ODPOWIEDZ