Следуя этой документации, я тестирую, как остановить и возобновить процесс. У меня есть базовый код для тестирования следующим образом:
#include <iostream>
#include <csignal>
#include <unistd.h>
int main() {
std::cout << "Hello" << std::endl;
int pid = getpid();
kill(pid, SIGSTOP);
kill(pid, SIGCONT);
std::cout << "Bye" << std::endl;
return 0;
}
Результат:
Hello
Он останавливает процесс, но никогда не возобновляет его. Как мне это исправить?
@JHBonarius Я понимаю, что ты имеешь в виду. Спасибо.
Полезная ссылка: networklessons.com/uncategorized/…





Решение, хотя и немного сложное, состоит в том, чтобы создать дочерний процесс для запуска и остановки родительского. Вот небольшой пример кода, который может помочь:
#include <iostream>
#include <csignal>
#include <unistd.h>
int pid; //Include declaration outside so it transfers to the child process
int main() {
std::cout << "Hello" << std::endl;
pid = getpid();
int returned_pid = fork(); //Duplicate process into 2 identical processes
if (returned_pid) {
// If it is the parent process, then fork returns the child process pid
// This is executed by the parent process
usleep(1000); // Sleep a millisecond to allow for the stop command to run
} else {
// If fork returns 0, then it is the child process
// The else is executed by the child process
kill(pid, SIGSTOP); // Stop parent process
usleep(3000000); // Delay 3 seconds
kill(pid, SIGCONT); // Resume parent process
}
if (returned_pid) { // Only print if parent process
std::cout << "Bye" << std::endl;
}
return 0;
}
Уточнение: команда fork возвращает 2 разных значения в 2 процессах: 0 в дочернем процессе и pid дочернего процесса в родительском.
Другое примечание: при запуске этого в терминале это будет выглядеть странно, так как терминал может отметить, что процесс был остановлен, и дать новую командную строку, но затем процесс возобновится, поэтому напечатает Bye поверх него. Просто заметка.
Спасибо за блестящий ответ. Думаю #include <sys/types.h> не нужен.
Если процесс останавливается сам, он останавливается. Поэтому он не выполняет следующую инструкцию. т.е. он никогда не сможет перезапустить себя. Вам нужен отдельный процесс или таймер или прерывание или что-то еще, что не остановлено, что может перезапустить остановленный процесс