內(nèi)存分為四個區(qū)域 內(nèi)核區(qū) 堆 棧 常量區(qū)
子進(jìn)程是父進(jìn)程的復(fù)制品驱证,執(zhí)行一次返回兩次,在使用 堆恋腕,棧抹锄,或者常量區(qū)的時候都是寫時復(fù)制,以下是程序示例
func.h
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#define args_check(argc,num) {if(argc!=num) {printf("error args\n");return -1;}}
fork.c
#include "func.h"
int g_iNum=10;
int main()
{
pid_t pid;
pid=fork();
if(0==pid)
{//這里是子進(jìn)程的代碼
printf("I am child process,g_iNum=%d\n",g_iNum);
g_iNum=5;
printf("I am child process,g_iNum=%d,g_iNum_addr=%p\n",g_iNum,&g_iNum);
}else{
//這里是父進(jìn)程的代碼
printf("I am parent process,g_iNum=%d\n",g_iNum);
sleep(1);
printf("I am parent process,g_iNum=%d,g_iNum_addr=%p\n",g_iNum,&g_iNum);
return 0;
}
}
#include "func.h"
//堆空間
int main()
{
pid_t pid;
char *p=(char*)malloc(20);
strcpy(p,"hello");
pid=fork();
if(0==pid)
{//這里是子進(jìn)程的代碼
printf("I am child process,%s\n",p);
strcpy(p,"world");
printf("I am child process,%s,%p\n",p,p);
}else{
//這里是父進(jìn)程的代碼
printf("I am parent process,%s\n",p);
sleep(1);
printf("I am parent process,%s,%p\n",p,p);
return 0;
}
}
//椳伲空間
#include "func.h"
int main()
{
pid_t pid;
int iNum=10;
pid=fork();
if(0==pid)
{//這里是子進(jìn)程的代碼
printf("I am child process,iNum=%d\n",iNum);
iNum=5;
printf("I am child process,iNum=%d,iNum_addr=%p\n",iNum,&iNum);
}else{
//這里是父進(jìn)程的代碼
printf("I am parent process,iNum=%d\n",iNum);
sleep(1);
printf("I am parent process,iNum=%d,iNum_addr=%p\n",iNum,&iNum);
return 0;
}
}
#include "func.h"
int main()
{
pid_t pid;
int fd=open("file",O_RDWR);
pid=fork();
if(0==pid)
{//這里是子進(jìn)程的代碼
printf("I am child process\n");
lseek(fd,5,SEEK_SET);
}else{
//這里是父進(jìn)程的代碼
printf("I am parent process\n");
sleep(1);
char buf[128]={0};
read(fd,buf,sizeof(buf));
printf("I am parent process,%s\n",buf);
return 0;
}
}