+static int setup_tasks_and_schedule(void)
+{
+ struct sched sched = {
+ .default_timeout = {
+ .tv_sec = conf.timeout_arg / 1000,
+ .tv_usec = (conf.timeout_arg % 1000) * 1000,
+ },
+ };
+ struct cmd_task cmd_task = {
+ .task = {
+ .status = "cmd",
+ .pre_select = command_pre_select,
+ .post_select = command_post_select,
+ },
+ };
+ struct status_task status_task = {
+ .task = {
+ .status = "status",
+ .pre_select = status_pre_select,
+ .post_select = status_post_select,
+ },
+ };
+ struct input_task input_task = {
+ .task = {
+ .status = "input",
+ .pre_select = input_pre_select,
+ .post_select = input_post_select,
+ },
+ };
+ struct signal_task signal_task = {
+ .task = {
+ .status = "signal",
+ .pre_select = signal_pre_select,
+ .post_select = signal_post_select,
+ },
+ };
+ signal_task.fd = para_signal_init();
+ para_install_sighandler(SIGINT);
+ para_install_sighandler(SIGTERM);
+ para_install_sighandler(SIGCHLD);
+ para_install_sighandler(SIGWINCH);
+ para_install_sighandler(SIGUSR1);
+
+ register_task(&sched, &cmd_task.task);
+ register_task(&sched, &status_task.task);
+ register_task(&sched, &input_task.task);
+ register_task(&sched, &signal_task.task);
+ return schedule(&sched);
+}
+