- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是“APUE”第 8 章中的练习(练习 8.2,第 2 版)。所有描述是:
Recall the typical arrangement of memory in Figure 7.6. Because the stack frames corresponding to each function call are usually stored in the stack, and because after a vfork the child runs in the address space of the parent, what happens if the call to vfork is from a function other than main and the child does a return from this function after the vfork? Write a test program to verify this, and draw a picture of what’s happening.
在我的程序中:
static void f1(void), f2(void);
int main(void) {
printf("main address: %d\n", main);
f1();
f2();
_exit(0);
}
static void f1(void) {
printf("f1 address: %d\n", f1);
pid_t pid;
if ((pid = vfork()) < 0)
err_sys("vfork error");
}
static void f2(void) {
printf("f2 address: %d\n", f2);
char buf[1000];
int i;
for (i = 0; i < sizeof(buf); ++i)
buf[i] = 0;
}
我运行程序,输出是:
main address: 4196560
f1 address: 4196604
f2 address: 4196663
f1 address: 4196604
[1] 12929 segmentation fault ./a.out
我对输出感到困惑。
f1地址:xxx
,我们调用vfork(),子进程先运行。 f2地址:xxx
,然后子进程调用_exit(0)。但是为什么打印f1地址:4196604
两次并且为什么f1和f2的地址不相同?
最佳答案
我不确定“f1 的 statck 帧被 f2 更改”是什么意思。
无论vfork()
如何,f2()
中的代码在任何情况下都可能出现段错误。 buf
未初始化。没有理由相信它包含以空结尾的字符串。因此,对 strlen()
的调用可以读取缓冲区的末尾。
无论如何,我不确定您希望循环做什么。在第一次迭代中,i
为 0。如果对 strlen()
的调用没有出现段错误,则循环体将 0 存储在 buf[0]
.因此,在循环的下一次迭代中,strlen(buf)
将为0,i
将为1(不小于0),因此循环将终止.
第二次打印f1 address: 4196604
是在vfork()
-ed子进程退出后父进程继续运行的时候。父进程继续并调用 f1()
来打印该内容。
您打印的数字是 f1
和 f2
本身的地址。为什么您期望 f1
的地址与 f2
的地址相同?它们不是,所以它们打印不同的地址。
另一方面,f1
的地址在父进程和子进程中是相同的,因为子进程共享父进程的地址空间。因此,f1
两次都会打印相同的地址。
关于在函数中调用 vfork(),对结果感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29454353/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!