linux fork程式空間問題
學系統程式設計都會學到程式與及執行緒,在學習Linux程式設計過程中,最大的困難花時間最多的莫過於程式那一塊,包括程式的環境,程式的控制,程式間通訊,程式共享記憶體等。
fork()是linux生成一個新程式的函式,在《unix環境高階程式設計》書中P172頁是這樣描述的:子程式是父程式的副本。例如,子程式獲得父程式的資料空間, 堆和棧的副本。注意,這是子程式所擁有的副本。父、子程式並不共享這些儲存空間部分。父子程式共享正文段。
既然子程式是父程式的一個副本,獲得父程式的資料空間,但又不是共享的,那麼是否子程式具有獨立的實體記憶體空間呢?父程式中的一個變數a是否還有另一個副本存在子程式空間實體記憶體裡,也即在父、子程式裡分別執行printf(“a address: %lx”, &a)會輸出不同的值呢?
[@more@]於是寫了一段測試程式,發現兩個變數實體地址一樣的,並且未初始化資料的地址也一,IPC共享記憶體段地址一樣,動態分配堆空間也一樣,納悶了很久,為什麼呢?
從輸出的結果來看,變數在實體記憶體只分配了一次,那麼子程式的變數副本又是如何實現的呢?不另外分配一塊記憶體來儲存它的變數, 那怎樣實現和父程式的變數取不同的值呢?
程式碼如下:
#include "apue.h"
#include
#define ARRAY_SIZE 40000
#define MALLOC_SIZE 100000
#define SHM_SIZE 100000
#define SHM_MODE 0600 /* user read/write */
char array[ARRAY_SIZE]; /* uninitialized data = bss */
int
main(void)
{
int shmid;
int n = 1;
char *ptr, *shmptr;
pid_t pid;
if ((shmid = shmget(IPC_PRIVATE, SHM_SIZE, SHM_MODE)) < 0)
err_sys("shmget error");
if ((shmptr = shmat(shmid, 0, 0)) == (void *)-1)
err_sys("shmat error");
if ((ptr = malloc(MALLOC_SIZE)) == NULL)
err_sys("malloc error");
TELL_WAIT();
if((pid = fork()) < 0)
err_sys("fork error");
else if(pid == 0)
{
n = 5;
printf("pid = %d ", getpid());
printf("n = %d,stack around %lx ", n, (unsigned long)&n);
printf("shared memory attached from %lx to %lx ",
(unsigned long)shmptr, (unsigned long)shmptr+SHM_SIZE);
printf("malloced from %lx to %lx ", (unsigned long)ptr,
(unsigned long)ptr+MALLOC_SIZE);
printf("array[] from %lx to %lx ", (unsigned long)&array[0],
(unsigned long)&array[ARRAY_SIZE]);
TELL_PARENT(pid);
exit(0);
}
WAIT_CHILD();
printf(" pid=%d ", getpid());
printf("n = %d, stack around %lx ", n, (unsigned long)&n);
printf("shared memory attached from %lx to %lx ",
(unsigned long)shmptr, (unsigned long)shmptr+SHM_SIZE);
printf("malloced from %lx to %lx ", (unsigned long)ptr,
(unsigned long)ptr+MALLOC_SIZE);
printf("array[] from %lx to %lx ", (unsigned long)&array[0],
(unsigned long)&array[ARRAY_SIZE]);
if (shmctl(shmid, IPC_RMID, 0) < 0)
err_sys("shmctl error");
exit(0);
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7406370/viewspace-926598/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux磁碟空間佔滿問題快速排雷Linux
- Linux fork程式的用法Linux
- linux核心初始化階段-fork內嵌問題Linux
- Linux檔案刪除但空間不釋放問題篇Linux
- RDSforSQLserver空間問題排查彙總SQLServer
- 處理Linux刪除檔案後空間未釋放的問題Linux
- Deepin v23安裝ArcGIS Server 10.8.1 for Linux報錯程式碼212可用空間不足的問題ServerLinux
- 為什麼問題空間與解決方案空間如此重要? - Nikhil Gupta
- LINUX 建立swap空間Linux
- linux 修改swap空間Linux
- [Linux]程序地址空間Linux
- 【多程式】Linux中fork()函式詳解|多程式Linux函式
- [20210528]oracle大表空間預分配問題.txtOracle
- 解決Ubuntu虛擬機器佔用空間與實際空間不符問題Ubuntu虛擬機
- Linux程式上下文和中斷上下文核心空間和使用者空間Linux
- LINUX 解決時間同步問題(NTP)Linux
- Jtti:如何解決空間ping值低的問題?Jtti
- oracle系統表空間過大問題處理Oracle
- 臨時表空間ORA-1652問題解決
- Linux擴充套件LVM空間Linux套件LVM
- interval 分割槽表clob預設表空間指定問題
- 排查和解決 CentOS 伺服器磁碟空間不足問題CentOS伺服器
- Python垃圾回收和Linux ForkPythonLinux
- 研究linux函式 之 fork()Linux函式
- database 空值問題Database
- linux檢視剩餘磁碟空間Linux
- Linux交換空間swap講解Linux
- Linux伺服器硬碟空間清理Linux伺服器硬碟
- fork、父程式和子程式
- 解決docker容器存放目錄磁碟空間滿了問題Docker
- 刪除UNDO表空間並處理ORA-01548問題
- Jtti:使用海外免備案空間建站要注意的問題Jtti
- 在用迅為的4418開發板Flash空間問題求解
- 1.5.1 Python程式使用 -- forkPython
- fork和殭屍程式
- 程式虛擬空間分佈
- 初學linux的fork筆記Linux筆記
- linux檢視mysql佔用磁碟空間LinuxMySql
- Linux 磁碟掛載和swap空間管理Linux