對於fork函數的說明:函數
只共享代碼段,可是數據段、堆、棧子進程也會從父進程中拷貝副本,可是並非和父進程共享相關資源,而是在本身的進程空間中維護。spa
下面這個例子主要是針對「共享代碼段」進行說明code
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/types.h> 4 #include <unistd.h> 5 6 int main(int argc, char** argv) 7 { 8 pid_t pid; 9 10 if ((pid = fork()) < 0) 11 printf("fork error\n"); 12 else if (pid == 0)//子進程 13 { 14 printf("child1(%d)....\n", getpid()); 15 } 16 else//父進程 17 { 18 printf("parent1(%d)...\n", getpid()); 19 } 20 21 printf("common:pid=%d\n", getpid()); 22 23 return 0; 24 }
運行結果:blog
common部分的代碼是很容易被忽視的地方。因此呢,爲了防止代碼複雜後致使common部分區分不清,最好使用以下形式:進程
if (pid=fork() < 0)資源
{get
printf("error\n");it
exit(0);io
}class
else if (pid == 0)
{
do someting in child process
}
else
{
do sometion in father process
}
do nothing
return;
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/types.h> 4 #include <unistd.h> 5 6 int main(int argc, char** argv) 7 { 8 pid_t pid; 9 int count = 0; 10 11 if ((pid = fork()) < 0) 12 printf("fork error\n"); 13 else if (pid == 0)//子進程 14 { 15 printf("child1(%d),pid=%d....\n", getpid(), pid); 16 printf("&count=%p, count=%d\n", &count, count); 17 ++count; 18 printf("&count=%p, count=%d\n", &count, count); 19 } 20 else//父進程 21 { 22 printf("parent1(%d),pid=%d...\n", getpid(), pid); 23 printf("&count=%p, count=%d\n", &count, count); 24 } 25 26 printf("common:pid=%d\n", getpid()); 27 28 return 0; 29 }
運行結果:
上面的例子中代表,雖然count變量被子進程從父進程複製過來,並且變量的地址都是同樣的,可是count變量在父子進程中,儘管邏輯地址相同但物理地址確定不一樣,因此不一樣的進程,進程的地址空間是不同的。