私は、forkを実行するプログラムを作成しようとしています。子プログラムはコマンドを実行し、親に制御を返します。私は親がSIGTSTP(Cz)シグナルを意図した通りに動作させるのに問題がありますが、親はそれを無視しますが、子は停止して親に制御を戻し、子を後で再開したり殺したりできるようにします。 (組み込みコマンド付き)。私は関連するコードを単なる小さなプログラムに分けてテストしましたが、A)Czがタイプされたときに子が止まらない、またはB)停止しますが、親にコントロールを返しません私は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
別の端末ウィンドウで 'ps'を使って' A'と 'B'の違いを知ることができます。子が停止している場合、それは 'T'状態になります。 – Barmar