summaryrefslogtreecommitdiff
path: root/src/kernel/task/task.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/task/task.cpp')
-rw-r--r--src/kernel/task/task.cpp15
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();