DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
OksSystem::Executable Class Reference

Wrapper for executable file manipulation. More...

#include <Executable.hpp>

Inheritance diagram for OksSystem::Executable:
[legend]
Collaboration diagram for OksSystem::Executable:
[legend]

Public Types

typedef std::vector< std::string > param_collection
typedef std::map< std::string, std::string > env_collection
Public Types inherited from OksSystem::File
typedef std::vector< OksSystem::Filefile_list_t

Public Member Functions

 Executable (const OksSystem::File &file)
 Executable (const char *filename)
 Executable (const std::string &filename)
 ~Executable ()
void exec () const
 run the executable
void exec (const param_collection &params) const
 run the executable
std::string pipe_in (const param_collection &params) const
 run the executable and pipe results back
std::string pipe_in (const param_collection &params, const env_collection &envs) const
Process pipe_out (const param_collection &params, const File &input_file, const File &output_file, const File &error_file, mode_t perm) const
Process pipe_out (const param_collection &params, const env_collection &envs, const File &input_file, const File &output_file, const File &error_file, mode_t perm) const
void exec (const param_collection &params, const env_collection &envs) const
 run the executable
Process start (const param_collection &params) const
 start the executable in another process
Process start_and_forget (const param_collection &params) const
 start the executable in another process; do not wait for termination of child
Process start (const param_collection &params, const env_collection &envs) const
 start the executable in another process
std::string to_string (const param_collection &params) const
 converts executable name and a parameter sequence into a string
Public Member Functions inherited from OksSystem::File
 File (const std::string &name)
 File (const char *name)
 File (const File &other)
virtual ~File ()
 operator std::string () const throw ()
 operator const char * () const throw ()
 operator bool () const throw ()
bool equals (const File &other) const throw ()
 compare two files *‍/
 operator size_t () const
const std::string & full_name () const throw ()
 full name for file *‍/
const char * c_full_name () const throw ()
std::string short_name () const throw ()
 short name for file *‍/
std::string parent_name () const throw ()
 path of directory containing file *‍/
std::string extension () const throw ()
 extension for file *‍/
int depth () const throw ()
 depth of the file *‍/
OksSystem::File parent () const
 parent of the current file *‍/
OksSystem::File child (const std::string &name) const
 named child of the current directory *‍/
OksSystem::File temporary (const std::string &prefix) const
bool exists () const throw ()
 does the file exist *‍/
mode_t permissions () const
 permissions for the file *‍/
std::string pretty_permissions () const
 pretty permissions for the file *‍/
size_t size () const
 size of file *‍/
uid_t owner_id () const
 owner id of file *‍/
User owner () const
 owner of the file *‍/
gid_t group () const
 group of file *‍/
bool is_regular () const
 is the file a directory *‍/
bool is_directory () const
 is the file a regular file *‍/
bool is_fifo () const
 is the file a named pipe *‍/
std::string file_type () const
 type of the file *‍/
file_list_t directory () const
 list of file in directory *‍/
void unlink () const
 deletes (unlinks) file *‍/
void rmdir () const
 deletes directory *‍/
void remove () const
 recursively delete files and directories *‍/
void rename (const File &other) const
 rename or moves the file *‍/
void permissions (mode_t permissions) const
 sets the type of the file *‍/
void make_dir (mode_t permissions) const
 creates a directory *‍/
void make_path (mode_t permissions) const
 creates a full path *‍/
void make_fifo (mode_t permissions) const
 creates a FIFO (named pipe) *‍/
void ensure_path (mode_t permissions) const
 creates the parent path *‍/
std::istream * input () const
 returns an input stream from the file*‍/
std::ostream * output (bool append=false) const
 returns an output stream to the file*‍/

Static Public Member Functions

static std::string okssystem (const std::string &command)
 execute a command in a shell
Static Public Member Functions inherited from OksSystem::File
static std::string protocol (const std::string &url) throw ()
 extracts the protocol part of an url *‍/
static std::string extension (const std::string &url) throw ()
 extracts the extension of a path or an url *‍/
static std::string uri (const std::string &url) throw ()
 extracts the local path of an url *‍/
static std::string short_name (const std::string &url) throw ()
 extracts the short file name of an url *‍/
static int depth (const std::string &path) throw ()
 calculates depth of a path *‍/
static std::string first_line (const std::string &text)
 extracts the first line of a text *‍/
static File from_url (const std::string &url)
 build a file out of an URL *‍/
static std::string working_directory ()
 current directory of process *‍/
static void working_directory (const File &dir)
 set working directory of process *‍/
static std::string expand_home (const std::string path)
 resolve home directory *‍/
static std::string pretty_permissions (mode_t permissions)
 pretty prints permissions *‍/
static std::string to_string (mode_t permissions) throw ()
 converts permission to string *‍/
static std::string pretty_open_flag (int flags)
 pretty prints open flags *‍/
static std::string pretty_size (size_t size, bool cut_small)
 pretty prints a file size *‍/

Protected Member Functions

void exec (char **argv) const
 does the actual exec
void exec (char **const argv, char **const env) const
 does the actual exec setting the right environment for the child process
Protected Member Functions inherited from OksSystem::File
void set_name (const std::string &name)
 sets the name of the file *‍/
mode_t get_mode () const
 get mode associated with file (permission + type) *‍/

Static Protected Member Functions

static void copy_fd (int fd, std::ostream &target)
 copies the content of a file descriptor into a STL stream
Static Protected Member Functions inherited from OksSystem::File
static int unit (int u)
 calculates the value of a computer unit of order n (i.e KB,GB, etc *‍/

Static Protected Attributes

static const char *const SHELL_COMMAND = "/bin/sh"
 command to execute in a shell
static const char *const SHELL_COMMAND_PARAM = "-c"
 parameter to execute in a shell
Static Protected Attributes inherited from OksSystem::File
static const char *const HUMAN_SIZE_STR [] = { "B", "KB", "MB", "GB" }
 strings for pretty printing file sizes *‍/
static const char *const HUMAN_OPEN_STR [] = { "READ", "WRITE", "NOBLOCK", "APPEND", "CREATE", "TRUNCATE","EXCLUSIVE" }
 strings for pretty printing open flags *‍/
static const int KILOBYTE = 1024
 number of bytes in a kilobyte *‍/
static const char *const FILE_COMMAND_PATH = "/usr/bin/file"

Additional Inherited Members

Static Public Attributes inherited from OksSystem::File
static const char *const FILE_FLAG_STR = "-rwxS"
 column headers for display of permissions *‍/
static const char *const FILE_PROTOCOL = "file"
 string for the file protocol *‍/
Protected Attributes inherited from OksSystem::File
std::string m_full_name
 full name (path) of the file *‍/

Detailed Description

Wrapper for executable file manipulation.

This class represents an executable file, that is a program. The class offers facilities to launch the program with given parameters environnement variables

Author
Matthias Wiesmann
Version
1.0

Definition at line 34 of file Executable.hpp.

Member Typedef Documentation

◆ env_collection

typedef std::map<std::string, std::string> OksSystem::Executable::env_collection

Definition at line 38 of file Executable.hpp.

◆ param_collection

typedef std::vector<std::string> OksSystem::Executable::param_collection

Definition at line 37 of file Executable.hpp.

Constructor & Destructor Documentation

◆ Executable() [1/3]

OksSystem::Executable::Executable ( const OksSystem::File & file)

Definition at line 59 of file Executable.cpp.

59: OksSystem::File(file) {}

◆ Executable() [2/3]

OksSystem::Executable::Executable ( const char * filename)

Definition at line 60 of file Executable.cpp.

60: OksSystem::File(filename) {}

◆ Executable() [3/3]

OksSystem::Executable::Executable ( const std::string & filename)

Definition at line 61 of file Executable.cpp.

61: OksSystem::File(filename) {}

◆ ~Executable()

OksSystem::Executable::~Executable ( )

Definition at line 62 of file Executable.cpp.

62{}

Member Function Documentation

◆ copy_fd()

void OksSystem::Executable::copy_fd ( int fd,
std::ostream & target )
staticprotected

copies the content of a file descriptor into a STL stream

Copies the content of a file descriptor into a STL stream

Parameters
fdthe source file descriptor
targetthe target stream
Note
a more efficient version could use the underlying STL buffer

Definition at line 316 of file Executable.cpp.

316 {
317 while(true) {
318 char buffer[256];
319 long status = read(fd,buffer,sizeof(buffer));
320 if (status <= 0) return;
321 ERS_ASSERT( status<=(long) sizeof(buffer) );
322 for(int i=0;i<status;i++) {
323 target << (char) buffer[i];
324 } // for
325 } // while
326} // copy_fd
#define ERS_ASSERT(expression)
read(ctx, obj, readall, continuous, print_out, read_period, save, file_name)
Definition hsi.py:151

◆ exec() [1/5]

void OksSystem::Executable::exec ( ) const

run the executable

◆ exec() [2/5]

void OksSystem::Executable::exec ( char ** argv) const
protected

does the actual exec

Core execution method. This method assumes the datastructures have been setup correctly for execv. It basically adds some error handling to execv

Parameters
argvarray of arguments, with name of the executable in first position
Note
this method should not be called directly

Definition at line 72 of file Executable.cpp.

72 {
73 ERS_PRECONDITION(argv);
74 ERS_PRECONDITION(argv[0]);
75 const int status = ::execv(argv[0],argv);
76 throw OksSystem::ExecutionIssue( ERS_HERE, errno, argv[0], status );
77} // exec
#define ERS_PRECONDITION(expression)
#define ERS_HERE

◆ exec() [3/5]

void OksSystem::Executable::exec ( char **const argv,
char **const env ) const
protected

does the actual exec setting the right environment for the child process

Core execution method. This method assumes the datastructures have been setup correctly for execve. It basically adds some error handling to execve. Look at the execve man pages for details.

Parameters
argvarray of arguments, with name of the executable in first position
envarray containing the environment the process will be started with

Definition at line 86 of file Executable.cpp.

86 {
87 ERS_PRECONDITION(argv);
88 ERS_PRECONDITION(argv[0]);
90 const int status = ::execve(argv[0],argv,env);
91 throw OksSystem::ExecutionIssue( ERS_HERE, errno, argv[0], status );
92}

◆ exec() [4/5]

void OksSystem::Executable::exec ( const param_collection & params) const

run the executable

Simple execution method. This methods converts the vector of strings into the correct data structures for execv. The argv structure is allocated dynamically and new string copied into it.

Definition at line 99 of file Executable.cpp.

99 {
100 const int argc = params.size(); // number of parameters
101 const int argclen = argc+2; // size of array parameters + program name + null pointer
102 char **argv = (char **) calloc(sizeof(char*),argclen);
103 OKSSYSTEM_ALLOC_CHECK(argv,sizeof(char*)*argclen);
104 const char* name = *this;
105 argv[0] = strdup(name);
106 OKSSYSTEM_ALLOC_CHECK(argv[0],strlen(name));
107 for(int i=0;i<argc;i++) {
108 argv[i+1] = strdup(params[i].c_str());
109 } // loop over args
110 argv[argc+1] = 0;
111 try {
112 exec(argv);
113 }
114 catch(OksSystem::ExecutionIssue &ex) {
115 for(int i=0;argv[i]!=0;i++) {
116 free(argv[i]);
117 } // for
118 free(argv);
119 throw;
120 }
121 catch (ers::Issue &issue) { // there was a problem so we deallocate the argc array.
122 for(int i=0;argv[i]!=0;i++) {
123 free(argv[i]);
124 } // for
125 free(argv);
126 throw;
127 } // catch
128} // exec
void exec() const
run the executable
#define OKSSYSTEM_ALLOC_CHECK(p, size)

◆ exec() [5/5]

void OksSystem::Executable::exec ( const param_collection & params,
const env_collection & envs ) const

run the executable

This execution method calls the 'execve' function executing the

Parameters
paramsthe parameters to use when launching the executable
envstable of the environnement variables set for the executable

Definition at line 135 of file Executable.cpp.

135 {
136
137 // Elaborate the environment
138 const unsigned int envArraySize = envs.size() + 1; // The last elements must be NULL
139 char** const env = new char*[envArraySize];
140
141 {
142 const env_collection::const_iterator b = envs.begin();
143 const env_collection::const_iterator e = envs.end();
144 env_collection::const_iterator it;
145
146 unsigned int counter = 0;
147 for(it = b; it != e; ++it) {
148 const std::string entry = it->first + "=" + it->second;
149 env[counter] = new char[entry.size() + 1]; // Add the NULL terminator
150 ::strcpy(env[counter], entry.c_str());
151 ++counter;
152 }
153
154 env[envArraySize - 1] = (char*) 0;
155 }
156
157 // Elaborate the paramenters
158 const unsigned int paramArraySize = params.size() + 2; // Add the executable name and the NULL terminator
159 char** const par = new char*[paramArraySize];
160
161 {
162 const std::string& binName = this->full_name();
163 par[0] = new char[binName.size() + 1]; // Add the NULL terminator
164 ::strcpy(par[0], binName.c_str());
165
166 const param_collection::const_iterator b = params.begin();
167 const param_collection::const_iterator e = params.end();
168 param_collection::const_iterator it;
169
170 unsigned int counter = 1;
171 for(it = b; it != e; ++it) {
172 const std::string& value = *it;
173 par[counter] = new char[value.size() + 1]; // Add the NULL terminator
174 ::strcpy(par[counter], value.c_str());
175 ++counter;
176 }
177
178 par[paramArraySize - 1] = (char*) 0;
179 }
180
181 try {
182 exec(par, env);
183 }
184 catch(OksSystem::ExecutionIssue& ex) {
185 // if we are here it means that the exec call failed!!!
186 // Free the allocated memory
187 for(unsigned int i = 0; i < envArraySize; ++i) {
188 delete[] env[i];
189 }
190 delete[] env;
191
192 for(unsigned int i = 0; i < paramArraySize; ++i) {
193 delete[] par[i];
194 }
195 delete[] par;
196
197 // Re-throw the exception
198 throw ex;
199 }
200
201}
const std::string & full_name() const
full name for file *‍/
Definition File.cpp:411

◆ okssystem()

std::string OksSystem::Executable::okssystem ( const std::string & command)
static

execute a command in a shell

This method is a safe replacement for the okssystem function. It basically offers the same functionality with better error handling. The command is executed in a shell via /bin/sh -c. If the command is successfull (return value 0), this method returns the resulting string.
If the command fails, this method throws an exception of type okssystem::ExecutionIssue. This exception contains the return code and the content of stderr.

Parameters
commandthe command to execute
Returns
the content of the stdout stream for the executed command
See also
pipe_in()

Definition at line 51 of file Executable.cpp.

51 {
52 OksSystem::Executable shell(SHELL_COMMAND);
53 std::vector<std::string> params;
54 params.push_back(SHELL_COMMAND_PARAM);
55 params.push_back(command);
56 return shell.pipe_in(params);
57} // std::string
static const char *const SHELL_COMMAND
command to execute in a shell
static const char *const SHELL_COMMAND_PARAM
parameter to execute in a shell

◆ pipe_in() [1/2]

std::string OksSystem::Executable::pipe_in ( const param_collection & params) const

run the executable and pipe results back

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 330 of file Executable.cpp.

330 {
331
332 int input_pipe[2];
333 int data_pipe[2];
334 int error_pipe[2];
335 const int input_pipe_status = pipe(input_pipe);
336 if (input_pipe_status<0) throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "pipe", "" );
337 const int data_pipe_status = pipe(data_pipe);
338 if (data_pipe_status<0) throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "pipe", "" );
339 const int error_pipe_status = pipe(error_pipe);
340 if (error_pipe_status<0) throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "pipe", "" );
341
342 // Block all signals before fork()
343 sigset_t new_set;
344 sigset_t old_set;
345 sigfillset(&new_set);
346 pthread_sigmask(SIG_SETMASK, &new_set, &old_set);
347
348 const pid_t child_id = fork();
349 if (0 == child_id) { // we are the child
350
351 // Put some signals to their default
352 signal(SIGTERM, SIG_DFL);
353 signal(SIGINT, SIG_DFL);
354
355 // Restore the original signal mask in child
356 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
357
358 dup2(input_pipe[1], fileno(stdin));
359 dup2(data_pipe[1], fileno(stdout));
360 dup2(error_pipe[1], fileno(stderr));
361
362 try {
363 this->exec(params);
364 }
365 catch(OksSystem::ExecutionIssue &ex) {
366 ers::warning(ex);
367 _exit(EXIT_FAILURE);
368 }
369 catch(ers::Issue &ex) {
370 ers::warning(ex);
371 _exit(EXIT_FAILURE);
372 }
373
374 } // we are the child
375 if (child_id > 0) { // we are the parent
376
377 // Restore the original signal mask in parent
378 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
379
380 Process child_process(child_id,to_string(params));
381 close(input_pipe[1]);
382 close(data_pipe[1]);
383 close(error_pipe[1]);
384 const int child_status = child_process.join();
385 const int in_fd = input_pipe[0];
386 const int err_fd = error_pipe[0];
387 const int out_fd = data_pipe[0];
388 std::ostringstream in_stream;
389 std::ostringstream out_stream;
390 std::ostringstream err_stream;
391 copy_fd(in_fd,in_stream);
392 copy_fd(out_fd,out_stream);
393 copy_fd(err_fd,err_stream);
394 close(in_fd);
395 close(out_fd);
396 close(err_fd);
397 if (0==child_status) {
398 return out_stream.str();
399 } // if
400 std::string command = to_string(params);
401 std::string error_str = err_stream.str();
402 throw OksSystem::ExecutionIssue(ERS_HERE,errno,command.c_str(),child_status);
403 } // we are the parent
404
405 // Restore the original signal mask in case of a fork() failure
406 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
407
408 return std::string();
409} // pipe_in
std::string to_string(const param_collection &params) const
converts executable name and a parameter sequence into a string
static void copy_fd(int fd, std::ostream &target)
copies the content of a file descriptor into a STL stream
void warning(const Issue &issue)
Definition ers.hpp:126

◆ pipe_in() [2/2]

std::string OksSystem::Executable::pipe_in ( const param_collection & params,
const env_collection & envs ) const

This method executes the process and pipes stdout and stderr back and waits for execution termination. If the return value is zero then the content of stdout is copied into a string and returned. In case of a non-zero value, an exception is thrown. This exception contains the return code and the content of stderr.

Returns
content of stdout
Parameters
paramsthe parameters to the executable
envsthe environnement variables to set
Exceptions
OksSystem::ExecutionIssueif command execution did not return 0.
OksSystem::ExecFailif the exec okssystem call failed.
OksSystem::PipeIssueif the pipe okssystem call failed.

Definition at line 423 of file Executable.cpp.

423 {
425 return pipe_in(params);
426} // pipe_in
std::string pipe_in(const param_collection &params) const
run the executable and pipe results back
static void set(const std::string &key, const std::string &value)
sets an environnement variable

◆ pipe_out() [1/2]

OksSystem::Process OksSystem::Executable::pipe_out ( const param_collection & params,
const env_collection & envs,
const File & input_file,
const File & output_file,
const File & error_file,
mode_t perm ) const

Runs the executable and redirects the two output streams

Parameters
paramsthe parameters for the executable
envsthe environnements for the executable
input_filethe input file for stdin
output_filethe output file for stdout
error_filethe output file for stderr
permpermissions for both output streams

Definition at line 498 of file Executable.cpp.

498 {
499
500 // Block all signals before fork()
501 sigset_t new_set;
502 sigset_t old_set;
503 sigfillset(&new_set);
504 pthread_sigmask(SIG_SETMASK, &new_set, &old_set);
505
506 OksSystem::Descriptor in(&input_file,OksSystem::Descriptor::flags(true,false),perm); // May throw OksSystem::OpenFileIssue
507 OksSystem::Descriptor out(&output_file,OksSystem::Descriptor::flags(false,true),perm);
508 OksSystem::Descriptor err(&error_file,OksSystem::Descriptor::flags(false,true),perm);
509
510 const pid_t child_id = fork();
511 if (0 == child_id) { // we are the child
512
513 // Put some signals to their default
514 signal(SIGTERM, SIG_DFL);
515 signal(SIGINT, SIG_DFL);
516
517 // Restore the original signal mask in child
518 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
519
520 try {
521 ::dup2(in,::fileno(stdin));
522 ::dup2(out,::fileno(stdout));
523 ::dup2(err,::fileno(stderr));
524 ::close(in.fd());
525 ::close(out.fd());
526 ::close(err.fd());
527 this->exec(params,envs);
528 }
529 catch(OksSystem::ExecutionIssue &ex) {
530 ers::warning(ex);
531 _exit(EXIT_FAILURE);
532 }
533 catch(OksSystem::PosixIssue &ex) {
534 ers::warning(ex);
535 _exit(EXIT_FAILURE);
536 }
537 catch(ers::Issue &ex) {
538 ers::warning(ex);
539 _exit(EXIT_FAILURE);
540 }
541
542 } // we are the child
543 if (child_id > 0) { // we are the parent
544
545 // Restore the original signal mask in parent
546 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
547
548 return Process(child_id,to_string(params));
549 } // we are the parent
550
551 // Restore the original signal mask in case of a fork() failure
552 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
553
554 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "fork", "" );// We are screwed up
555
556} //pipe_out
static int flags(bool read_mode, bool write_mode)
FELIX Initialization std::string initerror FELIX queue timed out

◆ pipe_out() [2/2]

OksSystem::Process OksSystem::Executable::pipe_out ( const param_collection & params,
const File & input_file,
const File & output_file,
const File & error_file,
mode_t perm ) const

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 430 of file Executable.cpp.

430 {
431
432 // Block all signals before fork()
433 sigset_t new_set;
434 sigset_t old_set;
435 sigfillset(&new_set);
436 pthread_sigmask(SIG_SETMASK, &new_set, &old_set);
437
438 OksSystem::Descriptor in(&input_file,OksSystem::Descriptor::flags(true,false),perm); // May throw OksSystem::OpenFileIssue
439 OksSystem::Descriptor out(&output_file,OksSystem::Descriptor::flags(false,true),perm);
440 OksSystem::Descriptor err(&error_file,OksSystem::Descriptor::flags(false,true),perm);
441
442 const pid_t child_id = fork();
443 if (0 == child_id) { // we are the child
444
445 // Put some signals to their default
446 signal(SIGTERM, SIG_DFL);
447 signal(SIGINT, SIG_DFL);
448
449 // Restore the original signal mask in child
450 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
451
452 try {
453 ::dup2(in,::fileno(stdin));
454 ::dup2(out,::fileno(stdout));
455 ::dup2(err,::fileno(stderr));
456 ::close(in.fd());
457 ::close(out.fd());
458 ::close(err.fd());
459 this->exec(params);
460 }
461 catch(OksSystem::ExecutionIssue &ex) {
462 ers::warning(ex);
463 _exit(EXIT_FAILURE);
464 }
465 catch(OksSystem::PosixIssue &ex) {
466 ers::warning(ex);
467 _exit(EXIT_FAILURE);
468 }
469 catch(ers::Issue &ex) {
470 ers::warning(ex);
471 _exit(EXIT_FAILURE);
472 }
473
474 } // we are the child
475 if (child_id > 0) { // we are the parent
476
477 // Restore the original signal mask in parent
478 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
479
480 return Process(child_id,to_string(params));
481 } // we are the parent
482
483 // Restore the original signal mask in case of a fork() failure
484 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
485
486 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "fork", "" );// We are screwed up
487} // pipe_out

◆ start() [1/2]

OksSystem::Process OksSystem::Executable::start ( const param_collection & params) const

start the executable in another process

This method starts the executable in another process using fork

Parameters
paramsthe parameters to use when launching the executable
Returns
A process object representing the started process

Definition at line 209 of file Executable.cpp.

209 {
210
211 // Block all signals before fork()
212 sigset_t new_set;
213 sigset_t old_set;
214 sigfillset(&new_set);
215 pthread_sigmask(SIG_SETMASK, &new_set, &old_set);
216
217 const pid_t child_id = fork();
218 if (0 == child_id) { // we are the child
219
220 // Put some signals to their default
221 signal(SIGTERM, SIG_DFL);
222 signal(SIGINT, SIG_DFL);
223
224 // Restore the original signal mask in child
225 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
226
227 try {
228 exec(params);
229 }
230 catch(OksSystem::ExecutionIssue &ex) {
231 ers::warning(ex);
232 _exit(EXIT_FAILURE);
233 }
234 catch(ers::Issue &ex) {
235 ers::warning(ex);
236 _exit(EXIT_FAILURE);
237 }
238
239 } // we are the child
240 if (child_id > 0) { // we are the parent
241
242 // Restore the original signal mask in parent
243 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
244
245 return Process(child_id,to_string(params));
246
247 } // we are the parent
248
249 // Restore the original signal mask in case of a fork() failure
250 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
251
252 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "fork", "" );// We are screwed up
253} // start

◆ start() [2/2]

OksSystem::Process OksSystem::Executable::start ( const param_collection & params,
const env_collection & envs ) const

start the executable in another process

This method starts the executable in another process using fork

Parameters
paramsthe parameters to use when launching the executable
envstable of the environnement variables set for the executable

Definition at line 563 of file Executable.cpp.

563 {
564
565 // Block all signals before fork()
566 sigset_t new_set;
567 sigset_t old_set;
568 sigfillset(&new_set);
569 pthread_sigmask(SIG_SETMASK, &new_set, &old_set);
570
571 const pid_t child_id = fork();
572 if (child_id == 0) { // we are the child
573
574 // Put some signals to their default
575 signal(SIGTERM, SIG_DFL);
576 signal(SIGINT, SIG_DFL);
577
578 // Restore the original signal mask in child
579 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
580
581 try {
582 exec(params,envs);
583 }
584 catch(OksSystem::ExecutionIssue &ex) {
585 ers::warning(ex);
586 _exit(EXIT_FAILURE);
587 }
588 catch(ers::Issue &ex) {
589 ers::warning(ex);
590 _exit(EXIT_FAILURE);
591 }
592
593 } // we are the child
594 if (child_id > 0) { // we are the parent
595
596 // Restore the original signal mask in parent
597 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
598
599 return Process(child_id);
600 } // we are the parent
601
602 // Restore the original signal mask in case of a fork() failure
603 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
604
605 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "fork", "" );// We are screwed up
606} // start

◆ start_and_forget()

OksSystem::Process OksSystem::Executable::start_and_forget ( const param_collection & params) const

start the executable in another process; do not wait for termination of child

This method starts the executable in another process using fork. The parent will not wait on the child termination.

Parameters
paramsthe parameters to use when launching the executable
Returns
A process object representing the started process

Definition at line 261 of file Executable.cpp.

261 {
262
263 // Block all signals before fork()
264 sigset_t new_set;
265 sigset_t old_set;
266 sigfillset(&new_set);
267 pthread_sigmask(SIG_SETMASK, &new_set, &old_set);
268
269 signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */
270
271 const pid_t child_id = fork();
272 if (0 == child_id) { // we are the child
273
274 // Put some signals to their default
275 signal(SIGTERM, SIG_DFL);
276 signal(SIGINT, SIG_DFL);
277 signal(SIGCLD, SIG_DFL); /* Restore default SIGCLD handling in the child process */
278
279 // Restore the original signal mask in child
280 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
281
282 try {
283 exec(params);
284 }
285 catch(OksSystem::ExecutionIssue &ex) {
286 ers::warning(ex);
287 _exit(EXIT_FAILURE);
288 }
289 catch(ers::Issue &ex) {
290 ers::warning(ex);
291 _exit(EXIT_FAILURE);
292 }
293
294 } // we are the child
295 if (child_id > 0) { // we are the parent
296
297 // Restore the original signal mask in parent
298 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
299
300 return Process(child_id,to_string(params));
301 } // we are the parent
302
303 // Restore the original signal mask in case of a fork() failure
304 pthread_sigmask(SIG_SETMASK, &old_set, NULL);
305
306 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "fork", "" );// We are screwed up
307} // start

◆ to_string()

std::string OksSystem::Executable::to_string ( const param_collection & params) const

converts executable name and a parameter sequence into a string

Converts the executable name and a list of parameters into a string, suitable for display.

Parameters
paramsthe list of parameters
Returns
a string with command name and parameters separated by spaces

Definition at line 614 of file Executable.cpp.

614 {
615 std::ostringstream stream;
616 stream << m_full_name;
617 for(param_collection::const_iterator pos=params.begin();pos!=params.end();++pos) {
618 stream << " " << (*pos);
619 } // for
620 return stream.str();
621} // to_string
std::string m_full_name
full name (path) of the file *‍/
Definition File.hpp:41

Member Data Documentation

◆ SHELL_COMMAND

const char *const OksSystem::Executable::SHELL_COMMAND = "/bin/sh"
staticprotected

command to execute in a shell

Definition at line 42 of file Executable.hpp.

◆ SHELL_COMMAND_PARAM

const char *const OksSystem::Executable::SHELL_COMMAND_PARAM = "-c"
staticprotected

parameter to execute in a shell

Definition at line 43 of file Executable.hpp.


The documentation for this class was generated from the following files: