예제 #1
0
파일: poll.c 프로젝트: ikrabbe/nyx
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;
}
예제 #2
0
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;
}
예제 #3
0
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);
}
예제 #4
0
파일: shm.c 프로젝트: AndrewCooper/jack2
/* 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;
}