C编程vfork返回值

时间:2013-03-25 03:18:32

标签: c fork

我必须创建一个程序:

  • 索要号码
  • 创建子进程(使用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;
}

但我的代码不起作用,任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

为什么你期望它能起作用?在exec之后执行除_exitvfork之外的任何操作都会导致明确的未定义行为。参见:

vfork() system call

还有一些关于vfork的恐怖的进一步讨论:

http://ewontfix.com/7/

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

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

    孩子的
  • printf可能会严重损害父母的stdio状态。
  • n可以永久存储在寄存器中,在这种情况下,父母无法看到孩子所做的更改
  • 编译器可以看到nelse分支中未初始化,因此根本不需要生成任何代码来读取它(此分支通过访问其值不确定的对象无条件地调用UB )。

答案 1 :(得分:0)

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

答案 2 :(得分: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; }