0

我必须创建一个程序:

  • 要一个号码
  • 创建子进程(使用 vfork)
  • 计算平方根(在子进程中)
  • 显示父进程的平方根

这是我的代码

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

int main(int argc, char **argv)
{
    double n=0;
    printf("Number: "); //ask number
    scanf("%d", &n);

    pid_t pid = vfork(); //create child process

    if (pid==0)//if child process
    {
        printf("Child process started\n");
        n = sqrt(n);//calculate square root
    }
    else//parent process
    {
        printf("Returnning to parent process\n");
    printf("Square Root: %d",n);
    }       

    return 0;
}

但是我的代码不起作用,有人可以帮助我吗?

4

3 回答 3

2

你为什么期望它起作用?exec除了或_exit之后做任何事情都会vfork导致明确的未定义行为。看:

vfork() 系统调用

以及对以下恐怖的一些进一步讨论vfork

http://ewontfix.com/7/

http://www.openwall.com/lists/musl/2012/12/31/16

如果它很有趣,这里列出了您的程序可能存在的问题(UB 的表现形式):

  • printf在孩子中可能会严重破坏父母的标准输出状态。
  • n可以永久存储在寄存器中,在这种情况下,父母无法看到孩子所做的更改
  • 编译器可以看到它n在分支中未初始化else,因此它根本不需要生成任何代码来读取它(此分支通过访问值不确定的对象无条件地调用 UB)。
于 2013-03-25T03:23:39.123 回答
0
   int main(int argc, char **argv) {    int  n=0;


    pid_t pid = vfork(); //create child process

    if (pid==0)//if child process
    {
        printf("Child process started\n");
       scanf("%d",&n);

        n = sqrt(n);//calculate square root

       _exit(23);
    }
    else//parent process
    {
     printf("Returnning to parent process\n");
    printf("Square Root: %ld",n);
    }

    return 0; }
于 2014-02-03T13:44:52.050 回答
0

您正在计算孩子的平方根,但试图在父母中打印它。父母不知道平方根是什么。如果您希望父进程打印平方根,那么您需要以某种方式将该值从子进程传回父进程。您似乎更有可能在子进程中打印平方根。

于 2013-03-25T03:38:45.947 回答