永发信息网

大神,我用fork命令创建子进程,但是现在我有两个疑问1:假如子进程执

答案:3  悬赏:30  手机版
解决时间 2021-04-13 11:58
  • 提问者网友:niaiwoma
  • 2021-04-13 08:11
大神,我用fork命令创建子进程,但是现在我有两个疑问1:假如子进程执
最佳答案
  • 五星知识达人网友:忘川信使
  • 2021-04-13 08:36
回复humjb_1983谢谢你的回答,你说很精简!自己回复一下,大神们有错快帮我指出来不管vfork还是fork都需要新的内存页面来保存新进程数据的,vfork创建一个进程空间,但是虽然有空间,但里面什么都没有复制,子进程共享父进程的堆栈和地址空间,就是说新创建的pcb里面关于地址的数据都是父进程的,是只读共享。其实使用cow的fork也是这样的,pcb里面关于地址的数据都是父进程的。Exec:开始时父子两个指针指向父亲的dataaddr,子进程克隆了父进程的相关指针以达到数据共享.exec后指针值就变了,指向了新的内存,调用exec后,exec会修改子进程的指针值指向新的内存即exec用新调用程序的数据替换当前进程的对应数据,Vfork改变的是共享部分,要挂起主进程以达到数据不乱的目的,而fork一改变就复制,就不需要挂起主进程Vfork比fork多了一个同步动作,父进程会在子进程后继续执行,但是exec后就不存在这样的限制了,但是父子关系还是存在的。Cow内核的实现:内核的实现很简单。页面在内核的页面相关数据结构中被标识为只读和写入时复制。如果某个进程尝试修改某个页,将产生一个页面错误。然后内核处理页面错误,透明地复制这个页。在这个时候,当前进程的页面的写入时复制属性被清除,从此不再共享。就是说fork的时候凡是修改的部分都同时修改指针指向的地址和地址中的内容,没修改的部分指针指向共享内容。查看原帖>>
全部回答
  • 1楼网友:荒野風
  • 2021-04-13 10:37
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd[2];
if(pipe(fd)!=0){
std::cout<<"pipe failed"< exit(0);
}
pid_t pid=fork();
if(pid<0){
std::cout<<"fork failed"< exit(0);
}else if(pid > 0){
exit(0);
}else if(pid == 0){

int n_w = write(fd[1],"XXXXXX",10);
std::cout<<"child1 write :"< pid_t pid1=fork();
if(pid1<0){
std::cout<<"fork1 failed"< exit(0);
}else if(pid1 > 0){
exit(0);
}else{
std::cout<<"chiled2 process"< close(fd[1]);
fd[1]=-1;
char buf[1024]={0};
int n_r = read(fd[0],&buf,10);
std::cout< if(n_r == -1){
std::cout<<"errno:"< }
std::cout< }
}
return 0;
}
  • 2楼网友:雾月
  • 2021-04-13 09:06
system其实也调用了fork,并且产生了"子子进程"。你对子进程kill不会连带"子子进程"一起kill,也就是说当你kill子进程时,子进程就已经被kill掉了,但是"子子进程"没有被kill掉且正常运行,看上去就像子进程还活着一样,其实子进程已死。
所以会出现上述奇怪现象。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯