diff options
Diffstat (limited to 'src/kernel/task/task.cpp')
-rw-r--r-- | src/kernel/task/task.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/kernel/task/task.cpp b/src/kernel/task/task.cpp index 98204d6..7eb2b36 100644 --- a/src/kernel/task/task.cpp +++ b/src/kernel/task/task.cpp @@ -295,8 +295,6 @@ process::process(process* _parent, uint32_t _uid, uint32_t _privilege) : fd(12, data = 0; dataseg = 0; - fd.add((node*)-1); // descriptor #0 must not be used - stack = 0; if (privilege >= PL_USER) { //We are running in user mode size_t stacksBottom = K_HIGHHALF_ADDR - 0x01000000; @@ -431,7 +429,7 @@ void process_brk(size_t ptr) { current_process->sbrk(ptr - current_process->data); } -int process_run(char* file, char** args) { +int process_run(char* file, char** args, FILE zero_fd) { node* bin = vfs_find(root, file); if (bin == 0) return E_NOT_FOUND; if ((bin->type & FT_FILE) == 0) return E_INVALID; @@ -467,14 +465,21 @@ int process_run(char* file, char** args) { kfree(v); for (int i = 0; arg_data[i] != 0; i++) kfree(arg_data[i]); kfree(arg_data); - return (p == 0 ? E_INVALID : p->pid); + if (p == 0) { + return E_INVALID; + } else { + p->fd.set(0, current_process->fd.at((zero_fd < 0 ? 0 : zero_fd))); + return p->pid; + } } -int process_waitpid(int pid) { +int process_waitpid(int pid, int block) { if (pid <= 0) return E_INVALID_RANGE; process *p = proc_by_pid->at(pid); if (p != 0) { + if (block == 0) return E_NOT_FINISHED; + current_thread->queue_next = p->threads_waiting; p->threads_waiting = current_thread; thread_goInactive(); |