在函数

时间:2017-05-10 11:53:19

标签: c linux unix process fork

我正在尝试编写shell但我无法理解为什么"> "函数结束后主进程不会打印createProcess。 还有一种更好的方法来打印主流程中的东西吗?我已使用此if (mainPid == getpid()

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void createProcess(){
   pid_t  pid;
   pid = fork();
   if (pid == 0){
      printf("Process created\n");
      printf("Child pid is %d\n", getpid());
   }
}

char *read_line(){
   char *line = NULL;
   size_t bufsize = 0;
   getline(&line, &bufsize, stdin);
   return line;
}

int main(){
   pid_t mainPid = getpid();
   char* line = NULL;
   for (;;) {
      if (mainPid == getpid()){
         printf("> ");
         line = read_line();
         if (line[strlen(line) - 1] == '\n')
            line[strlen(line) - 1] = '\0';
         if (strcmp(line, "create") == 0)
            createProcess();
         else printf("Write \"Create\"\n" );
      }
   }
free(line);
return 0;
}  

预期产出

> create
Process created
Child pid is 2417
> 

3 个答案:

答案 0 :(得分:1)

您应该在fflush(stdout)之后调用printf("> ")以确保显示字符串,因为它不是以换行结束,而是stdout是行缓冲的。但是,在子进程有机会写入之前可能会显示"> ",实际输出"> Process created"

此外,仅仅比较PID,子进程将在for(;;)中无限循环,所以你也应该修复它。

答案 1 :(得分:1)

P

所以我测试了它并得到了这个^(注意&#34;&gt;&#34;之前&#34;创建过程&#34;)。 这意味着它打印出的不是您想要的顺序。

修改此修复:

> create

> Process created

Child pid is 5655

得到了这个输出:

void createProcess(){
      pid_t  pid;
      pid = fork();
      if (pid == 0){
         printf("Process created\n");
         printf("Child pid is %d\n", getpid());
         exit(0);
      }
      if (pid > 0) {
         int stat_loc;
         wait(&stat_loc);
      }
   }

答案 2 :(得分:1)

请注意,您在子进程中有一个活动循环,这可能会导致意外的副作用。

以下是发生的事情

for(;;) unterminated loop
| if parent => ok first pass is parent
| fork
  -----------------------------
  | (parent)                   | (child)
  | loop as expected           | still loops!
                               | getpid() != mainPid so won't read a line
                               | and infinitely loops...

你的循环应该是:

  while (mainPid == getpid()){  // let child terminate...
     printf("> ");
     line = read_line();
     if (line[strlen(line) - 1] == '\n')
        line[strlen(line) - 1] = '\0';
     if (strcmp(line, "create") == 0)
        createProcess();
     else if (strcmp(line, "exit") == 0) break;  // add clean exit...
     else printf("Write \"Create\"\n" );
  }

正确使用Clang编译器...