父进程分配内存并赋值,vfork的子进程可以访问,但是退出崩溃了,该怎么处理
父进程分配内存并赋值,vfork的子进程可以访问,但是退出崩溃了
我尝试做一个试验,在父进程里面分配一个内存,这个在vfork的时候,子进程和父进程会共享这个堆,是吧?
但是实际的运行结果是,父进程里面访问这个i的是否,既不是2也不是3,而是一个非常大的数。并且delete这一步崩溃了(core dump)
什么原因造成的呢?
------解决思路----------------------
印象中vfork之后,子进程不能这么退出。
man vfork
The child must not return from the current function or call exit(3), but may call _exit(2).
你把最后的return改为_exit试试
我尝试做一个试验,在父进程里面分配一个内存,这个在vfork的时候,子进程和父进程会共享这个堆,是吧?
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
int *i=new int;
*i=2;
pid_t id = vfork();
if(id==0)//child
{
printf("child, i=%d\n",*i);
*i=3;
printf("changed, i=%d\n",*i);
printf("child exit\n");
return 0;
}
if(id<0)abort();
if(id>0)
{
int s;
wait(&s);
}
printf("father, i=%d\n",*i);
delete i;
return 0;
}
但是实际的运行结果是,父进程里面访问这个i的是否,既不是2也不是3,而是一个非常大的数。并且delete这一步崩溃了(core dump)
child, i=2
changed, i=3
child exit
father, i=521088614
*** Error in `./a.out': free(): invalid pointer: 0x00007f0722269265 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7d56d)[0x7f07222ad56d]
./a.out[0x400977]
/lib64/libc.so.6(__libc_start_main+0xfc)[0x7f0722251afc]
./a.out[0x4007f9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 fd:01 17800183 /home/a/a.out
00600000-00601000 r--p 00000000 fd:01 17800183 /home/a/a.out
00601000-00602000 rw-p 00001000 fd:01 17800183 /home/a/a.out
01399000-013ba000 rw-p 00000000 00:00 0 [heap]
7f0722230000-7f07223e6000 r-xp 00000000 fd:01 33665163 /usr/lib64/libc-2.17.so
7f07223e6000-7f07225e6000 ---p 001b6000 fd:01 33665163 /usr/lib64/libc-2.17.so
7f07225e6000-7f07225ea000 r--p 001b6000 fd:01 33665163 /usr/lib64/libc-2.17.so
7f07225ea000-7f07225ec000 rw-p 001ba000 fd:01 33665163 /usr/lib64/libc-2.17.so
7f07225ec000-7f07225f1000 rw-p 00000000 00:00 0
7f07225f1000-7f0722606000 r-xp 00000000 fd:01 33595528 /usr/lib64/libgcc_s-4.8.2-20140120.so.1
7f0722606000-7f0722805000 ---p 00015000 fd:01 33595528 /usr/lib64/libgcc_s-4.8.2-20140120.so.1
7f0722805000-7f0722806000 r--p 00014000 fd:01 33595528 /usr/lib64/libgcc_s-4.8.2-20140120.so.1
7f0722806000-7f0722807000 rw-p 00015000 fd:01 33595528 /usr/lib64/libgcc_s-4.8.2-20140120.so.1
7f0722807000-7f0722908000 r-xp 00000000 fd:01 33665171 /usr/lib64/libm-2.17.so
7f0722908000-7f0722b07000 ---p 00101000 fd:01 33665171 /usr/lib64/libm-2.17.so
7f0722b07000-7f0722b08000 r--p 00100000 fd:01 33665171 /usr/lib64/libm-2.17.so
7f0722b08000-7f0722b09000 rw-p 00101000 fd:01 33665171 /usr/lib64/libm-2.17.so
7f0722b09000-7f0722bf2000 r-xp 00000000 fd:01 33737206 /usr/lib64/libstdc++.so.6.0.19
7f0722bf2000-7f0722df1000 ---p 000e9000 fd:01 33737206 /usr/lib64/libstdc++.so.6.0.19
7f0722df1000-7f0722df9000 r--p 000e8000 fd:01 33737206 /usr/lib64/libstdc++.so.6.0.19
7f0722df9000-7f0722dfb000 rw-p 000f0000 fd:01 33737206 /usr/lib64/libstdc++.so.6.0.19
7f0722dfb000-7f0722e10000 rw-p 00000000 00:00 0
7f0722e10000-7f0722e31000 r-xp 00000000 fd:01 33665156 /usr/lib64/ld-2.17.so
7f0723005000-7f072300a000 rw-p 00000000 00:00 0
7f072302d000-7f0723030000 rw-p 00000000 00:00 0
7f0723030000-7f0723031000 r--p 00020000 fd:01 33665156 /usr/lib64/ld-2.17.so
7f0723031000-7f0723032000 rw-p 00021000 fd:01 33665156 /usr/lib64/ld-2.17.so
7f0723032000-7f0723033000 rw-p 00000000 00:00 0
7ffff4e5b000-7ffff4e7c000 rw-p 00000000 00:00 0 [stack]
7ffff4fb7000-7ffff4fb9000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
什么原因造成的呢?
------解决思路----------------------
印象中vfork之后,子进程不能这么退出。
man vfork
The child must not return from the current function or call exit(3), but may call _exit(2).
你把最后的return改为_exit试试