Как отправить программу в фоновый режим и остановить выполнение? - PullRequest
0 голосов
/ 01 марта 2019

Я новичок в обработке сигналов Си.Поэтому я пытаюсь приостановить выполнение программы и отправить ее в фоновый режим, а затем продолжить ее после отправки SIGCONT.Не уверен, как приостановить программу.Если я продолжу программу, она также должна быть возобновлена ​​с того места, где она остановилась.Но я не уверен, как это сделать.Должен ли я просто использовать pause ()?Буду признателен за любой совет, я просто тренируюсь и играю с обработкой сигнала.

void tSTP_handler(int signal){
    // not sure how to suspend program execution in handler and send it to background
}

int main(){
    signal(SIGTSTP, tSTP_handler);
    while(1){
         printf("Not suspended\n");
    }
    printf("resumed\n");
}

1 Ответ

0 голосов
/ 01 марта 2019

простых шагов:

  1. запустить процесс и разветвить дочерний процесс, распечатать журнал каждые 1 мс на дочернем процессе
  2. отправить сигнал (SIGSTOP, SIGCONT) надочерний процесс на родительском процессе, приостановленный на 100 мс между SIGSTOP и SIGCONT
  3. наблюдает задержку дочернего процесса.

код:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <unistd.h>

#define MS 1000 // 1ms

long get_curr_time()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec * 1000000L + tv.tv_usec;
}

void do_child()
{
    int i = 0;
    long start, end, cost;
    for(i = 0; i < 3; i++) {
        start = get_curr_time();
        usleep(MS);
        end = get_curr_time();
        cost = end - start;
        if (cost > 2 * MS)
            printf("%d. cost time: %ld us, Delayed by SIGSTOP.\n", i, cost);
        else
            printf("%d. cost time: %ld us\n", i, cost);
    }
}

int main()
{
    int pid;
    pid = fork();
    if (pid == 0) {
        do_child();
    } else {
        usleep(2 * MS);

        kill(pid, SIGSTOP);     // pause 100ms
        usleep(100 * MS);
        kill(pid, SIGCONT);

        waitpid(pid, NULL, 0);
    }
    return 0;
}

результат:

0. cost time: 1066 us
1. cost time: 100886 us, Delayed by SIGSTOP.
2. cost time: 1057 us
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...