我必须创建一个程序:
这是我的代码
#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;
}
但我的代码不起作用,任何人都可以帮助我吗?
答案 0 :(得分:2)
为什么你期望它能起作用?在exec
之后执行除_exit
或vfork
之外的任何操作都会导致明确的未定义行为。参见:
还有一些关于vfork
的恐怖的进一步讨论:
http://www.openwall.com/lists/musl/2012/12/31/16
如果它很有意思,这里列出了你的程序可能存在的问题(UB的表现形式):
printf
可能会严重损害父母的stdio状态。n
可以永久存储在寄存器中,在这种情况下,父母无法看到孩子所做的更改n
在else
分支中未初始化,因此根本不需要生成任何代码来读取它(此分支通过访问其值不确定的对象无条件地调用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; }