Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #ifndef SUBPROCESS_H_
- #define SUBPROCESS_H_
- class Subprocess {
- public:
- Subprocess(const char* name_of_child_process);
- Subprocess(const Subprocess & obj);
- ~Subprocess();
- void Create_Process();
- private:
- pid_t pid;
- const char* cmdline;
- };
- void signal_handler(int signal);
- #endif /* SUBPROCESS_H_ */
- /*
- * Subprocess.cpp
- */
- #include <iostream>
- #include <sys/types.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <signal.h>
- #include <csignal>
- #include "Subprocess.h"
- #include <vector>
- #include <memory>
- using namespace std;
- void signal_handler(int signal)
- {
- cout<<"I am a signal handler"<<endl;
- int child_status;
- pid_t pid;
- for(;;)
- {
- pid=waitpid(-1, &child_status, WNOHANG);
- if(pid>0)
- {
- cout <<"Process with pid "<<pid<<" terminated"<<endl;
- pid=fork();
- cout << "Process with pid "<<pid<<"restarted "<<endl;
- break;
- }
- pause();
- }
- }
- Subprocess::Subprocess(const char* name_of_child_process)
- {
- cout<<"Default constructor"<<endl;
- cmdline=name_of_child_process;
- pid=fork();
- if (pid==-1) cout<<"Error ,process not fork"<<endl;
- else if (pid==0) {
- cout <<"I am children process"<<getpid()<<" My pa_pid "<<getppid()<<endl;
- execlp("gnome-terminal","gnome-terminal","-e",cmdline,NULL);
- cout<<"Child process created with name "<<cmdline<<endl;
- for(;;);
- }
- else
- {
- cout<<"I am a parent with pid "<<getpid()<<endl;
- signal(SIGCHLD,signal_handler);
- }
- }
- void Subprocess::Create_Process()
- {
- }
- Subprocess::~Subprocess() {
- kill(pid,SIGTERM);
- }
- int main()
- {
- Subprocess process1("/bin/sh");
- //Subprocess process2("xclock");
- //vector<shared_ptr<Subprocess> > processes;
- //processes.push_back(process1("/bin/sh"));
- //processes.push_back(make_shared<Subprocess>("/bin/sh"));
- }
- pid=fork();
- if (pid==-1) cout<<"Error ,process not fork"<<endl;
- else if (pid==0) {
- cout <<"I am children process"<<getpid()<<" My pa_pid "<<getppid()<<endl;
- execlp("gnome-terminal","gnome-terminal","-e",cmdline,NULL);
- // Этот код, следующий ПОСЛЕ execlp, не будет выполняться НИКОГДА
- cout<<"Child process created with name "<<cmdline<<endl;
- for(;;);
- }
- else
- {
- cout<<"I am a parent with pid "<<getpid()<<endl;
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Запоминаем pid в списке запущенных процессов
- }
Add Comment
Please, Sign In to add comment