Zdravei,

On Fri, 25 May 2001, George Danchev wrote:

>neuspeshno , prosto tazi funkciq vse oste ne raboti) i sled kato izte4e 
>TIMEOUT parametura koito  mu se zadava (opitvah na nqkolko ftp servera s 
>mnogo golemi timeout stoinosti - ne resume-va )  autoslack prekratqwa rabota 
>. Trqbwa ru4no da se startira otnovo i zlopolu4niq package ste bude izteglen 
>otna4alo , za ve4e izteglinite nqma problemi - spool-nati sa v edin
>dir . Ta pri men taka 3 puti dropwashe na polovinata na glibc-2.2.2 (27MB) 
>... dialer-a (v moq slu4ai) reconnect-va , no autoslack ne iska da resume-ne 
>:(((.
Predpolagam, che tova e bilo mnogo nepriatno :-(

>Ta pitaneto mi e slednoto :
...
>Ta moje li nqkoi da nahvurlq suvsem grubo nqkolko red4eta na takuv keepalive 
>bash script koito da sledi i restartira : autoslack -opt1 -opt2 -optX
>( moje i na drug script ezik ) , a az posle ste si go "doumorq". 
Prastam ti edna cqla C programa, kompilira se s

        gcc -o keepalive keepalive.c

Sled tova pishesh

        ./keepalive command [arguments]

sled koeto keepalive instalira SIGCHLD handler, fork-va command child,
i usleep(). Ako child command terminira, keepalive poluchava SIGCHLD,
sybuwda se, fork-va nov command child i pak zaspiva...

Edinstveniq nachin da prekratish tozi cikyl e da kill-nesh keepalive.

Predpolagam, che autoslack e konzolna programa, a pyk keepalive sym q
pisal s mnogo verbose prints, koito mogat da sa nepodhodiasti za teb,
zatova mojesh spokoino da iztriesh vsicko sto e printf() v keepalive.c

Razbira se, ne poemam nikakva garanciq za tazi programa.
Use at your own risk ;-))

Pozdravi,
Vladimir Dzhuvinov
--
PGP  1024D/959FC3BC 2001-02-12 Vladimir Dzhuvinov <[EMAIL PROTECTED]>
     Key fingerprint = CB20 FC83 775C C34E 49D5  0F71 BAE5 7C38 959F C3BC
     Download public PGP key from http://www.valan.net/vdzhuvinov.asc
/* Vladimir Djouvinov, 12-2-1999
 * Forks out a child process and goes into sleep-wakeup cycle
 * If a SIGCHILD is received (child process died), 
 * a new instance of it is forked
*/



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>


char* full_program_invocation_name;
char* command;
char** arguments;
pid_t child_pid;



int
start_process ()
{

        /* --- check for NULL function arguments --- */
        if (command == NULL)
                {
                fprintf(stderr, "%s: no process to start\n",
                        full_program_invocation_name);
                return (1);
                }


        /* --- fork scan process --- */

        child_pid = fork();

        if(child_pid == -1)
                {
                /* fork() failed */
                fprintf(stderr, "%s: forking failed: %s\n",
                                full_program_invocation_name,
                                strerror(errno));
                return (1);
                }
                
        else if(child_pid == 0)
                {
                /* child */
                if ((execvp (command, arguments) )==-1)
                        {
                        fprintf(stderr, "%s: couldn't execute %s: %s\n",
                                        full_program_invocation_name, 
                                        command,
                                        strerror(errno));
                        return (1);
                        }

                /* exit child. note the use of _exit() instead of exit() */
                _exit(-1);
                }
        else
                /* parent */
                {
                printf ("%s: forked child process with pid %d\n",
                        full_program_invocation_name,
                        child_pid);
                }
                        
        
        return (0);
}                                       


void
child_exit (int sig)
{
        
        int exit_status;
        
        puts("received SIGCHLD");
        
        if (waitpid(child_pid, &exit_status, WNOHANG | WUNTRACED) == -1)
                fprintf(stderr, "%s: couldn't get status of child process(pid=%d): 
%s\n",
                        full_program_invocation_name, 
                        child_pid, 
                        strerror(errno));
                        
        printf ("%s: child process(pid=%d) terminated with status %d, starting new 
process...\n",
                full_program_invocation_name,
                child_pid,
                WEXITSTATUS(exit_status));

        start_process();
        
                
}



int
main (int argc, char *argv[])
{

        int i;

        /* --- set the program invocation name for error reporting--- */
        full_program_invocation_name = argv[0];

        /* --- check input --- */
        if (argc == 1){
                printf ("%s: usage %s command [options...]\n",
                        full_program_invocation_name,
                        full_program_invocation_name);
                return (1);
        }

        /* --- install a signal handler for the child exit signal --- */
        if (signal (SIGCHLD, child_exit)==SIG_ERR) {
                printf ("%s: signal CHLD cannot be handled\n",
                        full_program_invocation_name);
                return (1);
        }
        
        /* --- set the command of the process to be started --- */
        command = argv[1];
        printf ("command is %s\n", command);
        
        /* --- set the process arguments pointer --- */
        arguments = (char**)malloc(argc * sizeof(char*));
        for (i=0; i < argc; ++i) {
                arguments[i] = argv[i+1];
                printf ("ref. %d = %s\n", i, arguments[i]);
        }
        arguments[++i] == NULL;
        
        /* --- call fork wrapper --- */
        start_process();
        
        while (1)
                sleep(60);
        
        return (0);
        
}

Reply via email to