greatbridf 2 лет назад
Родитель
Сommit
e32a680f5d

+ 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);
 }