0

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

#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. 如何在主函数中创建多个进程?
  5. 如何控制多个进程的执行?
  6. exec()功能有什么作用?任何人都可以用源代码解释我的工作exec()原理吗?fork()getpid()

请帮助这个新手。

4

3 回答 3

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,然后如果联机帮助页中的某些内容仍不清楚,则返回具体问题。

于 2011-06-01T09:56:57.787 回答
0

输出生成两次,因为您分叉了两次:

if(pid=fork()<0)  // Fork #1
{ 
   printf("\nfailed to create the process\n");
}
if(pid=fork()==0) // Fork #2
于 2011-06-01T09:58:55.603 回答
0

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

pid=fork()

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

fork 将零返回给自身,并将其进程 id 返回给其父级

那是考虑一个进程A分叉B(不是来自您的代码)

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

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

pid is : 512 //一些整数值进程id

和 B 打印

PID是:0

所以在你的问题中

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

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

于 2011-06-01T09:59:52.373 回答