This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

service terminates after logging out of the desktop


Hi, I wrote a small program that launches a java rmi server. And it should run all the time. The service is running when the system is up but as soon as I log out of the Desktop, the service terminates. I believed that there must be a signal emitted but no luck, it doesn't log anything except "starting MvServer".

the command I used for installing the service: `cygrunsrv -I MvServer -d "CYGWIN MvServer" -p /bin/MvServer.exe`

the command I used for compilling the service program: `gcc -D_JNI_IMPLEMENTATION_ -I/cygdrive/c/Programme/Java/jdk1.6.0_13/include -I/cygdrive/c/Programme/Java/jdk1.6.0_13/include/win32 MvServer.c -L/cygdrive/c/Programme/Java/jdk1.6.0_13/lib/ -ljvm -o MvServer.exe`


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <jni.h>

typedef struct _MvServer MvServer;

struct _MvServer{
  JavaVM *jvm;
  JNIEnv *env;
} server = {
  NULL, NULL
};

void mv_server_main_thread();
void mv_server_alarm_signal();
void mv_server_hup_signal();
void mv_server_term_signal();
void mv_server_quit_signal();
void mv_server_chld_signal();
void mv_server_int_signal();

FILE *log_fd;

void
mv_server_alarm_signal(int sig)
{
  signal(SIGALRM, SIG_IGN);

  fprintf(log_fd, "received alarm signal: exiting\n\0");
  fflush(log_fd);
}

void
mv_server_hup_signal(int sig)
{
  signal(SIGHUP, SIG_IGN);

  fprintf(log_fd, "received hup signal: exiting\n\0");
  fflush(log_fd);
}

void
mv_server_term_signal(int sig)
{
  jclass cls;
  jmethodID mid;
  jint rc;

  signal(SIGTERM, SIG_IGN);

  fprintf(log_fd, "received term signal: exiting\n\0");
  fflush(log_fd);

  cls = (*(server.env))->FindClass((server.env), "MvServer\0");
  
  if(cls == 0){
    fprintf(log_fd, "couldn't invoke MvServer\n\0");
    fflush(log_fd);
    exit(0);
  }

  mid = (*(server.env))->GetStaticMethodID((server.env), cls, "shutdown\0", "([Ljava/lang/String;)V\0");
  
  if(mid == 0){
    fprintf(log_fd, "couldn't get shutdown\n\0");
    fflush(log_fd);
    fclose(log_fd);
    exit(0);
  }else{
    (*(server.env))->CallStaticVoidMethod((server.env), cls, mid, 0);
    (*(server.jvm))->DestroyJavaVM((server.jvm));
  }
}

void
mv_server_quit_signal(int sig)
{
  signal(SIGQUIT, SIG_IGN);

  fprintf(log_fd, "received quit signal: exiting\n\0");
  fflush(log_fd);
}

void
mv_server_chld_signal(int sig)
{
  signal(SIGCHLD, SIG_IGN);

  fprintf(log_fd, "received chld signal: exiting\n\0");
  fflush(log_fd);
}

void
mv_server_int_signal(int sig)
{
  signal(SIGINT, SIG_IGN);

  fprintf(log_fd, "received int signal: exiting\n\0");
  fflush(log_fd);
}

void
mv_server_main()
{
  JavaVM *jvm;
  JNIEnv *env;
  JavaVMInitArgs vm_args;
  JavaVMOption options[3];
  jclass cls;
  jmethodID mid;
  jint rc;

  options[0].optionString = "-Djava.class.path=C:\\classes\\MvServer;C:\\Programme\\jdom-1.1\\build\\jdom.jar;C:\\Programme\\Java\\jdk1.6.0_13;C:\\xampp\\tomcat\\lib\\servlet-api.jar\0";
  options[1].optionString = "-Djava.rmi.server.codebase=file:///c/classes/MvServer\0";
  options[2].optionString = "-Djava.security.policy=C:\\classes\\MvServer\\policy.txt\0";

  vm_args.version = JNI_VERSION_1_6;
  vm_args.nOptions = 3;
  vm_args.options = options;
  vm_args.ignoreUnrecognized = 0;

  rc = JNI_CreateJavaVM(&jvm, (void **) &env, (void *) &vm_args);

  if(rc < 0){
    fprintf(log_fd, "couldn't open Java VM\n\0");
    fflush(log_fd);
    fclose(log_fd);
    return(0);
  }

  server.jvm = jvm;
  server.env = env;

  cls = (*env)->FindClass(env, "MvServer");

  if(cls == 0){
    fprintf(log_fd, "couldn't invoke MvServer\n\0");
    fflush(log_fd);
    fclose(log_fd);
    return(0);
  }

  mid = (*env)->GetStaticMethodID(env, cls, "main\0", "([Ljava/lang/String;)V\0");

  if(mid == 0){
    fprintf(log_fd, "couldn't get main\n\0");
    fflush(log_fd);
    fclose(log_fd);
    return(0);
  }

  fprintf(log_fd, "calling main function of MvServer\n\0");

  (*env)->CallStaticVoidMethod(env, cls, mid, 0);

  (*jvm)->DestroyJavaVM(jvm);
}

int
main(int argc, char **argv)
{
  pthread_t rmi_thread;
  pthread_t main_thread;
  pid_t child_pid, wpid;
  int status;

  log_fd = fopen("/cygdrive/c/classes/MvServer/error.log\0", "w+\0");
  fprintf(log_fd, "starting MvServer\n\0");
  fflush(log_fd);

  signal(SIGALRM, mv_server_alarm_signal);
  signal(SIGHUP, mv_server_hup_signal);
  signal(SIGTERM, mv_server_term_signal);
  signal(SIGQUIT, mv_server_quit_signal);
  signal(SIGCHLD, mv_server_chld_signal);
  signal(SIGINT, mv_server_int_signal);


  if((child_pid = fork()) < 0){
    fprintf(log_fd, "failed to fork process\n\0");
  }else if(child_pid == 0){
    mv_server_main();
  }else{
    do{
      wpid = waitpid(child_pid, &status, WUNTRACED
#ifdef WCONTINUED
		     | WCONTINUED
#endif
		     );

      if(wpid == -1){
	perror("waitpid\0");
	exit(-1);
      }

      
      if(WIFEXITED(status)){
	fprintf(log_fd, "child exited, status=%d\n\0", WEXITSTATUS(status));
	
	
      }else if(WIFSIGNALED(status)){
	fprintf(log_fd, "child killed (signal %d)\n\0", WTERMSIG(status));
	
	
      }else if(WIFSTOPPED(status)){
	fprintf(log_fd, "child stopped (signal %d)\n\0", WSTOPSIG(status));
	
	
#ifdef WIFCONTINUED
      }else if(WIFCONTINUED(status)){
	fprintf(log_fd, "child continued\n\0");
#endif
      }else{
	fprintf(log_fd, "Unexpected status (0x%x)\n\0", status);
      }
    }while(!WIFEXITED(status) && !WIFSIGNALED(status));
  }

  fprintf(log_fd, "MvServer terminated\n\0");
  fflush(log_fd);
  fclose(log_fd);

  return(0);
}


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]