fork

對於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變量在父子進程中,儘管邏輯地址相同但物理地址確定不一樣,因此不一樣的進程,進程的地址空間是不同的。

相關文章
相關標籤/搜索