2020-11-16 19:32:50 +03:00
module os
2021-10-21 11:19:01 +03:00
// - ProcessState.not_started - the process has not yet started
// - ProcessState.running - the process is currently running
// - ProcessState.stopped - the process was running, but was stopped temporarily
// - ProcessState.exited - the process has finished/exited
// - ProcessState.aborted - the process was terminated by a signal
// - ProcessState.closed - the process resources like opened file descriptors were freed/discarded, final state.
2020-11-16 19:32:50 +03:00
pub enum ProcessState {
not_started
running
stopped
exited
aborted
2021-05-09 21:31:04 +03:00
closed
2020-11-16 19:32:50 +03:00
}
2021-02-13 17:52:01 +03:00
[ heap ]
2020-11-16 19:32:50 +03:00
pub struct Process {
pub mut :
2023-04-13 14:48:32 +03:00
filename string // the process's command file path
pid int // the PID of the process
code int = - 1
2020-11-16 19:32:50 +03:00
// the exit code of the process, != -1 *only* when status is .exited *and* the process was not aborted
2021-01-12 06:38:43 +03:00
status ProcessState = . not_started
2020-11-16 19:32:50 +03:00
// the current status of the process
2023-03-21 12:24:40 +03:00
err string // if the process fails, contains the reason why
args [ ] string // the arguments that the command takes
2023-04-13 14:48:32 +03:00
work_folder string // the initial working folder of the process. When '', reuse the same folder as the parent process.
2023-03-21 12:24:40 +03:00
env_is_custom bool // true, when the environment was customized with .set_environment
env [ ] string // the environment with which the process was started (list of 'var=val')
use_stdio_ctl bool // when true, then you can use p.stdin_write(), p.stdout_slurp() and p.stderr_slurp()
use_pgroup bool // when true, the process will create a new process group, enabling .signal_pgkill()
stdio_fd [ 3 ] int // the stdio file descriptors for the child process, used only by the nix implementation
wdata voidptr // the WProcess; used only by the windows implementation
create_no_window bool // sets a value indicating whether to start the process in a new window, The default is false; used only by the windows implementation
2020-11-16 19:32:50 +03:00
}
// new_process - create a new process descriptor
2022-03-06 20:01:22 +03:00
// Note: new does NOT start the new process.
2020-11-16 19:32:50 +03:00
// That is done because you may want to customize it first,
// by calling different set_ methods on it.
// In order to start it, call p.run() or p.wait()
pub fn new_process ( filename string ) & Process {
return & Process {
filename : filename
2021-04-04 17:05:06 +03:00
stdio_fd : [ - 1 , - 1 , - 1 ] !
2020-11-16 19:32:50 +03:00
}
}
// set_args - set the arguments for the new process
2021-03-15 10:23:43 +03:00
pub fn ( mut p Process ) set_args ( pargs [ ] string ) {
2020-11-16 19:32:50 +03:00
if p . status != . not_started {
2021-03-15 10:23:43 +03:00
return
2020-11-16 19:32:50 +03:00
}
p . args = pargs
2021-03-15 10:23:43 +03:00
return
2020-11-16 19:32:50 +03:00
}
2023-04-13 14:48:32 +03:00
// set_work_folder - set the initial working folder for the new process
// If you do not set it, it will reuse the current working folder of the parent process.
pub fn ( mut p Process ) set_work_folder ( path string ) {
if p . status != . not_started {
return
}
p . work_folder = real_path ( path )
return
}
2020-11-16 19:32:50 +03:00
// set_environment - set a custom environment variable mapping for the new process
2021-03-15 10:23:43 +03:00
pub fn ( mut p Process ) set_environment ( envs map [ string ] string ) {
2020-11-16 19:32:50 +03:00
if p . status != . not_started {
2021-03-15 10:23:43 +03:00
return
2020-11-16 19:32:50 +03:00
}
p . env_is_custom = true
p . env = [ ] string { }
for k , v in envs {
2022-11-15 16:53:13 +03:00
p . env << ' $ { k } = $ { v } '
2020-11-16 19:32:50 +03:00
}
2021-03-15 10:23:43 +03:00
return
2020-11-16 19:32:50 +03:00
}