int poll_loop(nyx_t *nyx, poll_handler_t handler) { int interval = MAX(nyx->options.polling_interval, 1); /* reset exit state in case this is a restart */ need_exit = 0; setup_signals(nyx, on_terminate); log_debug("Starting polling manager loop (interval: %d sec)", interval); while (!need_exit) { list_t *states = nyx->states; if (!states) { wait_interval_fd(nyx->event, interval); continue; } list_node_t *node = states->head; while (node) { state_t *state = node->data; pid_t pid = state->pid; if (pid < 1) { pid = determine_pid(state->watch->name, nyx); state->pid = pid; } if (pid > 0) { int running = check_process_running(pid); log_debug("Poll: watch '%s' process with PID %d is %srunning", state->watch->name, pid, (running ? "" : "not ")); handler(pid, running, nyx); } else { log_debug("Poll: watch '%s' has no PID (yet)", state->watch->name); } node = node->next; } wait_interval_fd(nyx->event, interval); } return 1; }
int process_running(string name, bool partial) { int result = check_process_running(name, partial); if (result == 0) COUT << "process not running " << name << endl; return result; }
void daemon_init(const char *prog, const char *pid_file, int nofork) { pid_t pid; if (check_process_running(prog, pid_file, &pid) && (pid != getpid())) { syslog(LOG_ERR, "daemon_init: Process \"%s\" already running.\n", prog); exit(1); } if (setup_sigmask() < 0) { syslog(LOG_ERR, "daemon_init: Unable to set signal mask.\n"); exit(1); } if(!nofork && daemon(0, 0)) { syslog(LOG_ERR, "daemon_init: Unable to daemonize.\n"); exit(1); } update_pidfile(pid_file); }
/* Claim server_name for this process. * * returns 0 if successful * EEXIST if server_name was already active for this user * ENOSPC if server registration limit reached * ENOMEM if unable to access shared memory registry */ int jack_register_server (const char *server_name, int new_registry) { int i, res = 0; jack_set_server_prefix (server_name); if (jack_server_initialize_shm (new_registry)) return ENOMEM; if (jack_shm_lock_registry () < 0) { jack_error ("jack_shm_lock_registry fails..."); return -1; } /* See if server_name already registered. Since server names * are per-user, we register the unique server prefix string. */ for (i = 0; i < MAX_SERVERS; i++) { if (strncmp (jack_shm_header->server[i].name, jack_shm_server_prefix, JACK_SERVER_NAME_SIZE) != 0) continue; /* no match */ if (jack_shm_header->server[i].pid == GetPID()){ res = 0; /* it's me */ goto unlock; } /* see if server still exists */ #ifdef WIN32 if (check_process_running(jack_shm_header->server[i].pid)) { res = EEXIST; /* other server running */ goto unlock; } #else if (kill (jack_shm_header->server[i].pid, 0) == 0) { res = EEXIST; /* other server running */ goto unlock; } #endif /* it's gone, reclaim this entry */ memset (&jack_shm_header->server[i], 0, sizeof (jack_shm_server_t)); } /* find a free entry */ for (i = 0; i < MAX_SERVERS; i++) { if (jack_shm_header->server[i].pid == 0) break; } if (i >= MAX_SERVERS){ res = ENOSPC; /* out of space */ goto unlock; } /* claim it */ jack_shm_header->server[i].pid = GetPID(); strncpy (jack_shm_header->server[i].name, jack_shm_server_prefix, JACK_SERVER_NAME_SIZE); unlock: jack_shm_unlock_registry (); return res; }