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