【问题标题】:c fork,exec,getpid problemc fork,exec,getpid 问题
【发布时间】:2011-06-01 09:50:42
【问题描述】:

我是 c 语言和 Linux 的新手。我有一个与 fork()、getpid() 和 exec() 函数有关的问题。 我使用 fork() 编写了一个 c 程序调用我的程序代码如下“ 代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

void fun()
{
  printf("\n this is trial for child process");
}

int main (int argc, char const *argv[])
{
  int i,status,pid,t;

  if(pid=fork()<0)
  { 
    printf("\nfailed to create the process\n");
  }
  if(pid=fork()==0)
  {
    printf("\n the child process is created");
    fun();
    exit(1);
  }
  while(wait(&status)!=pid);
  return 0;
}

这个程序的输出如下:

创建子进程

这是子进程的试用版

创建子进程

这是子进程的试用

现在我的问题如下:

  1. 为什么程序的输出显示相同的东西两次?输出应该是“子进程已创建,这是子进程的试验”
  2. 为什么输出不符合代码?
  3. 我们可以有一个程序,它有 4 个进程并且所有进程执行不同的任务,例如一个进程打印“我的名字”。一个进程打印“我的年龄”,另一个进程打印“我的地址?
  4. 如何在main函数中创建多个进程?
  5. 如何控制多个进程的执行?
  6. exec() 函数有什么作用?谁能用源代码解释一下exec()fork()getpid() 的工作原理?

请帮助这个新手。

【问题讨论】:

    标签: c fork systems-programming fork-join


    【解决方案1】:

    您的代码多次调用fork()

    if(pid=fork()<0) /* calls fork() */
    { 
       ...
    }
    if(pid=fork()==0) /* also calls fork() */
    {
       ...
    }
    

    每个成功的fork() 都会创建一个新的子进程。更糟糕的是,第二个fork() 被父级和第一个子级调用。

    如果您尝试创建单个子进程,您应该只调用一次fork()

    pid_t pid; /* note the correct return type of fork() */
    ...
    pid = fork();
    if (pid < 0)
    { 
       ...
    }
    else if (pid == 0)
    { 
       ...
    }
    

    如果要创建多个子进程,可以让父进程循环调用fork()

    对于诸如“exec 是做什么的?”之类的问题,我的建议是学习如何使用man,然后如果联机帮助页中有不清楚的地方,请再提出具体问题。

    【讨论】:

      【解决方案2】:

      在此代码中,您将创建三个进程,不包括您的主进程。

      pid=fork()
      

      本身就是一个语句,即使它在 if 语句条件中,它也会派生一个新进程。在第一次 fork() 调用之后,剩余的代码将被执行两次。所以下一个分叉调用将被调用两次。您已经创建了一个新进程。

      fork 向自身及其自身返回零 进程 ID 到其父进程

      考虑一个进程 A 派生出 B(不是来自您的代码)

       pid = fork();
       printf("pid is : %d",pid);
      

      printf 语句执行两次(一次用于 A,一次用于 B)。对于 A 它打印(A 是父级)

      pid is : 512 //某个整数值 进程号

      和B打印

      pid 为:0

      所以在你的问题中

       if(pid=fork()==0)
        {
          printf("\n the child process is created");
          fun();
          exit(1);
        }
      

      这是已经执行了两次的第二个分叉。所以每次执行都会创建一个新的子进程。对于两个孩子的 pid 值都是 0。因此您的 print 语句将执行,这就是您在输出中看到的内容。但是对于父母双方来说,都会有一个 pid 值,并且您的 if 条件失败,因此不会打印。这两个孩子是你的第二个和第三个进程..所以简而言之,你创建了 3 个进程以及主进程

      【讨论】:

        【解决方案3】:

        输出会生成两次,因为你是 forking 两次:

        if(pid=fork()<0)  // Fork #1
        { 
           printf("\nfailed to create the process\n");
        }
        if(pid=fork()==0) // Fork #2
        

        【讨论】:

          猜你喜欢
          • 2012-11-24
          • 2012-01-23
          • 1970-01-01
          • 2013-07-18
          • 1970-01-01
          • 1970-01-01
          • 2013-05-06
          • 2015-12-01
          • 1970-01-01
          相关资源
          最近更新 更多