Преглед изворни кода

Merge branch 'vfork'

* vfork:
  Use vfork(2) where exec(2) is immediately done
Bryan Drewery пре 11 година
родитељ
комит
bf2f281aa6
2 измењених фајлова са 13 додато и 8 уклоњено
  1. 5 4
      src/conf.cc
  2. 8 4
      src/shell.cc

+ 5 - 4
src/conf.cc

@@ -222,15 +222,16 @@ confedit()
   signal(SIGCONT, SIG_DFL);
   signal(SIGCONT, SIG_DFL);
 
 
   my_gettime(&ts1);
   my_gettime(&ts1);
-  switch (pid = fork()) {
+  switch (pid = vfork()) {
     case -1:
     case -1:
       fatal(STR("Cannot fork"), 0);
       fatal(STR("Cannot fork"), 0);
     case 0:
     case 0:
     {
     {
       /* child */
       /* child */
-      execlp(editor, editor, tmpconf.file, (char*)NULL);
-      perror(editor);
-      exit(1);
+      if (execlp(editor, editor, tmpconf.file, (char*)NULL) == -1) {
+        perror(editor);
+        _exit(1);
+      }
      /*NOTREACHED*/}
      /*NOTREACHED*/}
     default:
     default:
       /* parent */
       /* parent */

+ 8 - 4
src/shell.cc

@@ -489,14 +489,18 @@ int simple_exec(const char* argv[]) {
   pid_t pid, savedpid;
   pid_t pid, savedpid;
   int status;
   int status;
 
 
-  switch ((pid = fork())) {
+  switch ((pid = vfork())) {
     case -1:
     case -1:
       break;
       break;
     case 0:		//child
     case 0:		//child
       // Close all sockets
       // Close all sockets
-      for (int fd = 3; fd < MAX_SOCKETS; ++fd) close(fd);
-      execvp(argv[0], (char* const*) &argv[0]);
-      _exit(127);
+      for (int fd = 3; fd < MAX_SOCKETS; ++fd) {
+        close(fd);
+      }
+      if (execvp(argv[0], (char* const*) &argv[0]) == -1) {
+        _exit(127);
+      }
+      /* NOTREACHED */
     default:		//parent
     default:		//parent
       savedpid = pid;
       savedpid = pid;
       do {
       do {