瀏覽代碼

Kernel: Forked processes should inherit arguments and environment.

Andreas Kling 6 年之前
父節點
當前提交
61e50780aa
共有 2 個文件被更改,包括 16 次插入19 次删除
  1. 14 17
      Kernel/Process.cpp
  2. 2 2
      Kernel/Process.h

+ 14 - 17
Kernel/Process.cpp

@@ -224,11 +224,8 @@ Process* Process::fork(RegisterDump& regs)
     dbgprintf("fork: child=%p\n", child);
     dbgprintf("fork: child=%p\n", child);
 #endif
 #endif
 
 
-#if 0
-    // FIXME: An honest fork() would copy these. Needs a Vector copy ctor.
-    child->m_arguments = m_arguments;
-    child->m_initialEnvironment = m_initialEnvironment;
-#endif
+    child->m_initial_arguments = m_initial_arguments;
+    child->m_initial_environment = m_initial_environment;
 
 
     for (auto& region : m_regions) {
     for (auto& region : m_regions) {
 #ifdef FORK_DEBUG
 #ifdef FORK_DEBUG
@@ -408,8 +405,8 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
     m_tss.ss2 = m_pid;
     m_tss.ss2 = m_pid;
 
 
     m_executable = descriptor->inode();
     m_executable = descriptor->inode();
-    m_arguments = move(arguments);
-    m_initialEnvironment = move(environment);
+    m_initial_arguments = move(arguments);
+    m_initial_environment = move(environment);
 
 
 #ifdef TASK_DEBUG
 #ifdef TASK_DEBUG
     kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), path.characters(), m_tss.eip);
     kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), path.characters(), m_tss.eip);
@@ -525,14 +522,14 @@ int Process::sys$get_environment(char*** environ)
     MM.map_region(*this, *region);
     MM.map_region(*this, *region);
     char* envpage = (char*)region->linearAddress.get();
     char* envpage = (char*)region->linearAddress.get();
     *environ = (char**)envpage;
     *environ = (char**)envpage;
-    char* bufptr = envpage + (sizeof(char*) * (m_initialEnvironment.size() + 1));
-    for (size_t i = 0; i < m_initialEnvironment.size(); ++i) {
+    char* bufptr = envpage + (sizeof(char*) * (m_initial_environment.size() + 1));
+    for (size_t i = 0; i < m_initial_environment.size(); ++i) {
         (*environ)[i] = bufptr;
         (*environ)[i] = bufptr;
-        memcpy(bufptr, m_initialEnvironment[i].characters(), m_initialEnvironment[i].length());
-        bufptr += m_initialEnvironment[i].length();
+        memcpy(bufptr, m_initial_environment[i].characters(), m_initial_environment[i].length());
+        bufptr += m_initial_environment[i].length();
         *(bufptr++) = '\0';
         *(bufptr++) = '\0';
     }
     }
-    (*environ)[m_initialEnvironment.size()] = nullptr;
+    (*environ)[m_initial_environment.size()] = nullptr;
     return 0;
     return 0;
 }
 }
 
 
@@ -543,13 +540,13 @@ int Process::sys$get_arguments(int* argc, char*** argv)
         return -ENOMEM;
         return -ENOMEM;
     MM.map_region(*this, *region);
     MM.map_region(*this, *region);
     char* argpage = (char*)region->linearAddress.get();
     char* argpage = (char*)region->linearAddress.get();
-    *argc = m_arguments.size();
+    *argc = m_initial_arguments.size();
     *argv = (char**)argpage;
     *argv = (char**)argpage;
-    char* bufptr = argpage + (sizeof(char*) * m_arguments.size());
-    for (size_t i = 0; i < m_arguments.size(); ++i) {
+    char* bufptr = argpage + (sizeof(char*) * m_initial_arguments.size());
+    for (size_t i = 0; i < m_initial_arguments.size(); ++i) {
         (*argv)[i] = bufptr;
         (*argv)[i] = bufptr;
-        memcpy(bufptr, m_arguments[i].characters(), m_arguments[i].length());
-        bufptr += m_arguments[i].length();
+        memcpy(bufptr, m_initial_arguments[i].characters(), m_initial_arguments[i].length());
+        bufptr += m_initial_arguments[i].length();
         *(bufptr++) = '\0';
         *(bufptr++) = '\0';
     }
     }
     return 0;
     return 0;

+ 2 - 2
Kernel/Process.h

@@ -347,8 +347,8 @@ private:
 
 
     static void notify_waiters(pid_t waitee, int exit_status, int signal);
     static void notify_waiters(pid_t waitee, int exit_status, int signal);
 
 
-    Vector<String> m_arguments;
-    Vector<String> m_initialEnvironment;
+    Vector<String> m_initial_arguments;
+    Vector<String> m_initial_environment;
     HashTable<gid_t> m_gids;
     HashTable<gid_t> m_gids;
 
 
     Region* m_stack_region { nullptr };
     Region* m_stack_region { nullptr };