首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

linux系统编程2——进程fork函数理解

2012-09-29 
linux系统编程二——进程fork函数理解#include sys/types.h#include sys/wait.h#include iostreamusin

linux系统编程二——进程fork函数理解

#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
????char buf[20] = "hello parent";//栈区


????char *pb = new char[20];//堆


????int n = 0;

????pid_t pid = 0;

????memset(pb, 0 ,20);

???? pb[0] = 'p';

????if ((pid = fork()) < 0)
????{
????????cout<<"fork error!"<<endl;

????????exit(1);
????}
????else if (pid == 0 ) //子进程

????{
???????? buf[0] = 'c';

???????? pb[0] = 'c';

???????? n = 1;
????}
????else
????{
????????sleep(10);//让父进程休眠,子进程先执行

????}

????cout<<getpid()<<":n address "<<(&n)<<",n="<<n
????????<<"\tbuf address "<<(&buf)<<",buf="<<buf
????????<<"\tpb addrss "<<(&pb)<<",pb="<<pb<<endl;

????exit(0);
}


输出结果为

15144:n address 0xbfe1f168,n=1 buf address 0xbfe1f170,buf=cello parent pb addrss 0xbfe1f16c,pb=c
15143:n address 0xbfe1f168,n=0 buf address 0xbfe1f170,buf=hello parent pb addrss 0xbfe1f16c,pb=p

?

?? 15144是子进程,15143是父进程,它们之间的变量的地址是一样的(在各自的进程地址空间内),子进程修改了变量的值,但是却没有影响到父进程,说明了子进程中的变量是父进程的一个副本,不会因为子进程中改变了它们的值而影响

父进程,也就是子进程中具有父进程的数据段的副本。子进程和父进程共享的只是代码段。

?

?? fork是一个特殊的函数,它执行一次,返回两次,在子进程中返回0,父进程中返回子进程的pid。当执行了fork函数后,子进程和父进程就开始在fork之后产生分支了,父进程和子进程分别向下执行。由于父进程和子进程并没有公共的数据段,所以无法使用公共的数据段作为系统通信的载体,可以使用无名管道(fifo创建),或者有名管道(mkdifo创建后,产生管道名字,接着使用open打开读写)进行通信。

?? 当子进程结束的时候,会向父进程发送一个SIGCHLD信号。因为子进程终止是个异步事件(可以在父进程允许的任何时候发送),这在信号也是内核向父进程发的异步通知。父进程可以选择忽略它,或者提供一个信号

热点排行