SIGTERM handler for Java fork process.
authorgumartinm <gu.martinm@gmail.com>
Wed, 18 Jan 2012 06:58:29 +0000 (07:58 +0100)
committergumartinm <gu.martinm@gmail.com>
Wed, 18 Jan 2012 06:58:29 +0000 (07:58 +0100)
JavaFork/Daemon/javafork
JavaFork/Daemon/javafork.c
JavaFork/Daemon/javafork.h
JavaFork/JavaExample/javafork-example/src/main/java/de/fork/java/MainJavaFork.java

index 6ad9212..7277198 100755 (executable)
Binary files a/JavaFork/Daemon/javafork and b/JavaFork/Daemon/javafork differ
index 6d78c0c..3ad2346 100644 (file)
 #include <sys/wait.h>
 #include <sys/poll.h>
 #include <string.h>
+#include <signal.h>
 #include "javafork.h"
 
+pid_t currentPID;
+int sockfd;
+
 
 int main (int argc, char *argv[]) {
     pid_t pid;
 
+       if (signal(SIGTERM, sigterm_handler) == SIG_ERR) 
+       {
+               perror ("\nerror signal handler");
+               return -1;
+       }
+
        if ((pid = fork()) == -1) {
                perror("fork: ");
        return -1;
@@ -30,6 +40,7 @@ int main (int argc, char *argv[]) {
        else {
                if (pid == 0) {
                        /*child process*/
+                       currentPID = getpid();
                        main_child(argc, argv);
                }
        }
@@ -42,7 +53,6 @@ int main_child (int argc, char *argv[]) {
        struct protoent *protocol;
        struct sockaddr_in addr_server;
        struct sockaddr_in  addr_client;
-       int sockfd;
     int sockclient;
     pthread_t idThread;
        int clilen;
@@ -137,6 +147,7 @@ void *serverThread (void * arg) {
        }
 
        close(sockclient);
+       /*FIXME: dunno why, but after finishing connection from client we have TIME_WAIT in this socket*/
        
        pthread_exit(0);
 }
@@ -345,3 +356,20 @@ int fork_system(int socket, char *command) {
 
        return 0;
 }
+
+
+void sigterm_handler(int sig)
+{
+       if (currentPID != getpid()) {
+               //Do nothing
+               return;
+       }
+       if (signal (SIGTERM, SIG_IGN) == SIG_ERR)
+       {
+               syslog (LOG_ERR, "signal desactivation failed");
+       }
+
+       close (sockfd);
+       /*TODO: kill child processes and release allocate memory*/
+       exit (0);
+}
index d6321a0..7f03332 100644 (file)
@@ -5,3 +5,4 @@ void *serverThread (void *arg);
 int daemonize(const char *pname, int facility, int option);
 int main_child (int argc, char *argv[]);
 int fork_system(int socket, char *command);
+void sigterm_handler();
index bed6b6a..a422cdd 100644 (file)
@@ -21,7 +21,7 @@ public class MainJavaFork  {
                
                final ByteArrayOutputStream stdoutByteOut = new ByteArrayOutputStream();
                final PrintStream stdout = new PrintStream(stdoutByteOut);
-               final String command = "ls -lah; ls -lah bbb aaa ccc; ls -lah";
+               final String command = "/home/gustavo/github/JavaForFun/JavaFork/Daemon/script.sh";
                final ByteArrayOutputStream stderrByteOut = new ByteArrayOutputStream();
                final PrintStream stderr = new PrintStream(stderrByteOut);
                int result;