Я пытаюсь написать программу, которая вилки, ребенок выполняет команду, а затем возвращает управление родительскому. У меня возникли проблемы с получением сигнала SIGTSTP (Cz) для работы по назначению, хотя ... Я хочу, чтобы родитель проигнорировал его, но ребенок остановил и вернул управление родительскому объекту, так что потом ребенок может быть возобновлен или убит (с встроенной командой). Я выделил соответствующий код в меньшую программу, чтобы проверить его, и кажется, что A) ребенок не останавливается при вводе Cz, или B) он останавливается, но не возвращает управление родительскому (я опираясь на это, потому что, когда я использую cat для stdin, он ведет себя по-разному после Cz). Вот мой код.Сигнал SIGTSTP не останавливает ребенка?
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <cstring>
#include <unistd.h>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <signal.h>
int main(){
std::cout.setf(std::ios::unitbuf);
std::vector<std::string> vec; vec.push_back("cat");
std::vector<char*> chvec;
for(unsigned int i = 0; i < vec.size(); i++){
chvec.push_back(&vec[i][0]);
}
chvec.push_back(NULL);
vec.erase(vec.begin(), vec.begin() + chvec.size());
char** argv = &chvec[0];
signal(SIGTSTP,SIG_IGN);
pid_t pid;
if((pid = fork()) == 0){
signal(SIGTSTP,SIG_DFL);
/*pid = getpid();
setpgid(pid,pid);*/
std::cout << "before exec" << std::endl;
execvp(argv[0],argv);
perror("exec");
}
else{
//setpgid(pid,pid);
int status;
waitpid(pid,&status,0);
if(WIFEXITED(status) || WIFSIGNALED(status)){
std::cout << "exited or signaled" << std::endl;
}
if(WIFSTOPPED(status)){
std::cout << "process stopped" << std::endl;
}
//std::cout << "process exited" << std::endl;
pause();
}
return EXIT_SUCCESS;
}
'chvec []' нужен конечный нулевой указатель. – Barmar
исправлено, что (хотя оно ничего не влияет) – faezer
Вы можете определить разницу между 'A' и' B', используя 'ps' в другом окне терминала. Если ребенок остановлен, он будет находиться в состоянии «T». – Barmar