This is the mail archive of the
cygwin
mailing list for the Cygwin project.
service terminates after logging out of the desktop
- From: joel at weedlight dot ch
- To: <cygwin at cygwin dot com>
- Date: Fri, 5 Feb 2010 13:36:34 +0100
- Subject: service terminates after logging out of the desktop
- Reply-to: joel at weedlight dot ch
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