Esempio n. 1
0
int
main(int argc, const char *const argv[]) {
  size_t nthds = 8;
  ssize_t nputs = 1000LL * 1000LL * 10LL;
  pid_t c_pid;

  if (argc >= 2) {
    size_t n;
    if (lagopus_str_parse_int64(argv[1], (int64_t *)&n) ==
        LAGOPUS_RESULT_OK) {
      if (n > 0) {
        nthds = (size_t)n;
      }
    }
  }
  if (argc >= 3) {
    ssize_t n;
    if (lagopus_str_parse_int64(argv[2], (int64_t *)&n) ==
        LAGOPUS_RESULT_OK) {
      if (n > 0) {
        nputs = (ssize_t)n;
      }
    }
  }

  (void)lagopus_signal(SIGHUP, s_sighandler, NULL);
  (void)lagopus_signal(SIGINT, s_sighandler, NULL);

  c_pid = fork();
  if (c_pid == 0) {
    is_child = true;
    return do_run(nthds, nputs);
  } else if (c_pid > 0) {
    int st;
    (void)waitpid(c_pid, &st, 0);
    return 0;
  } else {
    perror("fork");
    return 1;
  }
}
Esempio n. 2
0
int
main(int argc, const char *const argv[]) {
  lagopus_result_t st = LAGOPUS_RESULT_ANY_FAILURES;

  (void)lagopus_signal(SIGHUP, s_hup_handler, NULL);
  (void)lagopus_signal(SIGINT, s_term_handler, NULL);
  (void)lagopus_signal(SIGTERM, s_term_handler, NULL);
  (void)lagopus_signal(SIGQUIT, s_term_handler, NULL);

  parse_args(argc - 1, argv + 1);

  if (s_to > 0) {
    if ((st = lagopus_mainloop_set_shutdown_check_interval(s_to)) !=
        LAGOPUS_RESULT_OK) {
      lagopus_perror(st);
      goto done;
    }
  }

  st = lagopus_mainloop(argc, argv, NULL, NULL, false, false, false);

done:
  return (st == LAGOPUS_RESULT_OK) ? 0 : 1;
}
Esempio n. 3
0
int
main(int argc, const char *const argv[]) {
  lagopus_log_destination_t dst = LAGOPUS_LOG_EMIT_TO_UNKNOWN;
  const char *logarg;
  char *p;
  uint16_t cur_debug_level = lagopus_log_get_debug_level();
  int ipcfds[2];

  ipcfds[0] = -1;
  ipcfds[1] = -1;

  s_progname = ((p = strrchr(argv[0], '/')) != NULL) ? ++p : argv[0];

  parse_args(argc, argv);

  if (IS_VALID_STRING(s_logfile) == true) {
    dst = LAGOPUS_LOG_EMIT_TO_FILE;
    logarg = s_logfile;
  } else {
    dst = LAGOPUS_LOG_EMIT_TO_SYSLOG;
    logarg = s_progname;
  }
  /*
   * If the cur_debug_level > 0 the debug level is set by the lagopus
   * runtime so use it as is.
   */
  (void)lagopus_log_initialize(dst, logarg, false, true,
                               (cur_debug_level > 0) ?
                               cur_debug_level : s_debug_level);

  (void)lagopus_signal(SIGHUP, s_hup_handler, NULL);
  (void)lagopus_signal(SIGINT, s_term_handler, NULL);
  (void)lagopus_signal(SIGTERM, s_term_handler, NULL);
  (void)lagopus_signal(SIGQUIT, s_term_handler, NULL);

  if (s_debug_level == 0) {
    pid_t pid = (pid_t)-1;

    if (pipe(ipcfds) != 0) {
      lagopus_perror(LAGOPUS_RESULT_POSIX_API_ERROR);
      return 1;
    }

    pid = fork();
    if (pid > 0) {
      int exit_code;
      ssize_t st;

      (void)close(ipcfds[1]);
      if ((st = read(ipcfds[0], (void *)&exit_code, sizeof(int))) !=
          sizeof(int)) {
        lagopus_perror(LAGOPUS_RESULT_POSIX_API_ERROR);
        return 1;
      }

      return exit_code;

    } else if (pid == 0) {
      s_daemonize(ipcfds[1]);
      if (lagopus_log_get_destination() == LAGOPUS_LOG_EMIT_TO_FILE) {
        (void)lagopus_log_reinitialize();
      }
    } else {
      lagopus_perror(LAGOPUS_RESULT_POSIX_API_ERROR);
      lagopus_msg_error("can' be a daemon.\n");
      return 1;
    }
  }

  return s_do_main(argc, argv, ipcfds[1]);
}