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 29 of file Executable.hpp.

Member Typedef Documentation

◆ env_collection

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

Definition at line 33 of file Executable.hpp.

◆ param_collection

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

Definition at line 32 of file Executable.hpp.

Constructor & Destructor Documentation

◆ Executable() [1/3]

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

Definition at line 54 of file Executable.cpp.

54: OksSystem::File(file) {}
Wrapper for file operations.
Definition File.hpp:32

◆ Executable() [2/3]

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

Definition at line 55 of file Executable.cpp.

◆ Executable() [3/3]

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

Definition at line 56 of file Executable.cpp.

◆ ~Executable()

OksSystem::Executable::~Executable ( )

Definition at line 57 of file Executable.cpp.

57{}

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 311 of file Executable.cpp.

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

◆ 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 67 of file Executable.cpp.

67 {
68 ERS_PRECONDITION(argv);
69 ERS_PRECONDITION(argv[0]);
70 const int status = ::execv(argv[0],argv);
71 throw OksSystem::ExecutionIssue( ERS_HERE, errno, argv[0], status );
72} // 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 81 of file Executable.cpp.

81 {
82 ERS_PRECONDITION(argv);
83 ERS_PRECONDITION(argv[0]);
85 const int status = ::execve(argv[0],argv,env);
86 throw OksSystem::ExecutionIssue( ERS_HERE, errno, argv[0], status );
87}

◆ 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 94 of file Executable.cpp.

94 {
95 const int argc = params.size(); // number of parameters
96 const int argclen = argc+2; // size of array parameters + program name + null pointer
97 char **argv = (char **) calloc(sizeof(char*),argclen);
98 OKSSYSTEM_ALLOC_CHECK(argv,sizeof(char*)*argclen);
99 const char* name = *this;
100 argv[0] = strdup(name);
101 OKSSYSTEM_ALLOC_CHECK(argv[0],strlen(name));
102 for(int i=0;i<argc;i++) {
103 argv[i+1] = strdup(params[i].c_str());
104 } // loop over args
105 argv[argc+1] = 0;
106 try {
107 exec(argv);
108 }
109 catch(OksSystem::ExecutionIssue &ex) {
110 for(int i=0;argv[i]!=0;i++) {
111 free(argv[i]);
112 } // for
113 free(argv);
114 throw;
115 }
116 catch (ers::Issue &issue) { // there was a problem so we deallocate the argc array.
117 for(int i=0;argv[i]!=0;i++) {
118 free(argv[i]);
119 } // for
120 free(argv);
121 throw;
122 } // catch
123} // exec
void exec() const
run the executable
Base class for any user define issue.
Definition Issue.hpp:69
#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 130 of file Executable.cpp.

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

◆ 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 46 of file Executable.cpp.

46 {
48 std::vector<std::string> params;
49 params.push_back(SHELL_COMMAND_PARAM);
50 params.push_back(command);
51 return shell.pipe_in(params);
52} // std::string
Wrapper for executable file manipulation.
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 325 of file Executable.cpp.

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

◆ 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 418 of file Executable.cpp.

418 {
420 return pipe_in(params);
421} // 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 493 of file Executable.cpp.

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

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

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

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

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

609 {
610 std::ostringstream stream;
611 stream << m_full_name;
612 for(param_collection::const_iterator pos=params.begin();pos!=params.end();++pos) {
613 stream << " " << (*pos);
614 } // for
615 return stream.str();
616} // to_string
std::string m_full_name
full name (path) of the file *‍/
Definition File.hpp:36

Member Data Documentation

◆ SHELL_COMMAND

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

command to execute in a shell

Definition at line 37 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 38 of file Executable.hpp.


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