Bladeren bron

feat: getpid and getppid

greatbridf 2 jaren geleden
bovenliggende
commit
e32a680f5d
5 gewijzigde bestanden met toevoegingen van 28 en 1 verwijderingen
  1. 3 0
      gblibc/include/unistd.h
  2. 2 0
      gblibc/private-include/syscall.h
  3. 10 0
      gblibc/src/unistd.c
  4. 12 0
      src/kernel/syscall.cpp
  5. 1 1
      user-space-program/sh.c

+ 3 - 0
gblibc/include/unistd.h

@@ -33,6 +33,9 @@ unsigned int sleep(unsigned int seconds);
 int chdir(const char* path);
 char* getcwd(char* buf, size_t bufsize);
 
+pid_t getpid(void);
+pid_t getppid(void);
+
 int setpgid(pid_t pid, pid_t pgid);
 
 pid_t setsid(void);

+ 2 - 0
gblibc/private-include/syscall.h

@@ -12,6 +12,7 @@
 #define SYS_dup (32)
 #define SYS_dup2 (33)
 #define SYS_sleep (35)
+#define SYS_getpid (39)
 #define SYS_fork (57)
 #define SYS_execve (59)
 #define SYS_exit (60)
@@ -20,6 +21,7 @@
 #define SYS_getcwd (79)
 #define SYS_chdir (80)
 #define SYS_setpgid (109)
+#define SYS_getppid (110)
 #define SYS_setsid (112)
 #define SYS_getsid (124)
 

+ 10 - 0
gblibc/src/unistd.c

@@ -65,6 +65,16 @@ char* getcwd(char* buf, size_t bufsize)
     return (char*)syscall2(SYS_getcwd, (uint32_t)buf, bufsize);
 }
 
+pid_t getpid(void)
+{
+    return syscall0(SYS_getpid);
+}
+
+pid_t getppid(void)
+{
+    return syscall0(SYS_getppid);
+}
+
 int setpgid(pid_t pid, pid_t pgid)
 {
     return syscall2(SYS_setpgid, pid, pgid);

+ 12 - 0
src/kernel/syscall.cpp

@@ -408,6 +408,16 @@ int _syscall_ioctl(interrupt_stack* data)
     return 0;
 }
 
+int _syscall_getpid(interrupt_stack*)
+{
+    return current_process->pid;
+}
+
+int _syscall_getppid(interrupt_stack*)
+{
+    return current_process->ppid;
+}
+
 extern "C" void syscall_entry(interrupt_stack* data)
 {
     int syscall_no = data->s_regs.eax;
@@ -435,6 +445,7 @@ void init_syscall(void)
     syscall_handlers[32] = _syscall_dup;
     syscall_handlers[33] = _syscall_dup2;
     syscall_handlers[35] = _syscall_sleep;
+    syscall_handlers[39] = _syscall_getpid;
     syscall_handlers[57] = _syscall_fork;
     syscall_handlers[59] = _syscall_execve;
     syscall_handlers[60] = _syscall_exit;
@@ -443,6 +454,7 @@ void init_syscall(void)
     syscall_handlers[79] = _syscall_getcwd;
     syscall_handlers[80] = _syscall_chdir;
     syscall_handlers[109] = _syscall_setpgid;
+    syscall_handlers[110] = _syscall_getppid;
     syscall_handlers[112] = _syscall_setsid;
     syscall_handlers[124] = _syscall_getsid;
 }

+ 1 - 1
user-space-program/sh.c

@@ -233,7 +233,7 @@ main(void)
     setpgid(pid, 0);
     int code;
     wait(&code);
-    tcsetpgrp(STDOUT_FILENO, 3);
+    tcsetpgrp(STDOUT_FILENO, getpid());
   }
   _exit(0);
 }