當我使用fork()
創建子進程時,該子進程是父進程的副本。指針是指向每個進程中的同一事物,還是指針在子進程中有一個新的值。數組或文件指針怎麼樣?fork()是否創建別名?
回答
指針指向每個進程中的同一事物。
是的,所有的記憶被複制,包括指針。
數組或文件指針怎麼樣?
是的。在文件描述的情況下,它是有用的注意,任何文件描述符的家長開放,將引用相同的文件在子進程。
大多數(所有?)Unix系統使用某種形式的副本上寫的優化,這意味着該過程實際上將共享物理內存,直到他們寫存儲器。這往往會使fork()成爲一個相當便宜的操作。
有拐角的情況下,由巴斯克斯 - 艾布拉姆斯指出。也許最重要的是隻有一個線程分叉,即調用fork()系統調用的線程。
從fork(2)
man page(重點煤礦):
新工藝,被稱爲孩子,是確切的重複調用進程的,被稱爲父,除了以下點:
* 孩子有其自己唯一的進程ID,並且此PID與任何現有進程組(setpgid(2))的ID不匹配。
* 孩子的父進程ID與父進程ID相同。
* 孩子不繼承父母的記憶鎖(mlock(2),mlockall(2))。
* 子進程資源利用率(getrusage(2))和CPU時間計數器(次數(2))被重置爲零。
* 孩子的待決信號集最初是空的(sigpending(2))。
* 孩子不會從其父母(semop(2))繼承信號量調整。
* 子項不從其父項(fcntl(2))繼承記錄鎖。
* 孩子不從父母(setitimer(2),alarm(2),timer_create(2))繼承定時器。
* 的孩子不繼承其父未完成的異步I/O操作(的aio_read(3),aio_write(3)),也沒有繼承任何異步I/O上下文從它的父(見io_setup(2 ))。
上述列表中的進程屬性全部在POSIX.1-2001中指定。父項和子項在以下特定於Linux的進程屬性方面也有所不同:
* 子項不從父項繼承目錄更改通知(dnotify)(請參閱fcntl(2)中的F_NOTIFY說明)。
* prctl(2)PR_SET_PDEATHSIG設置被重置,以便孩子在其父母終止時不會收到信號。
* 默認計時器鬆弛值設置爲父親的當前計時器鬆弛值。請參閱prctl(2)中的PR_SET_TIMERSLACK說明。
* 用madvise(2)MADV_DONTFORK標誌標記的內存映射不會通過fork()繼承。
* 孩子的終止信號總是SIGCHLD(參見克隆(2))。
* ioperm(2)設置的端口訪問權限位不會被子級繼承;孩子必須使用ioperm打開它需要的任何位(2)。
請注意以下幾點進一步指出:與單個線程創建
* 子過程 - 一個調用fork()的。父項的整個虛擬地址空間在子項中複製,包括互斥鎖,條件變量和其他pthreads對象的狀態;使用pthread_atfork(3)可能有助於處理這可能導致的問題。
* 孩子繼承父母的打開文件描述符集的副本。子項中的每個文件描述符都指向與父項中的相應文件描述符相同的打開文件描述(請參見open(2))。這意味着這兩個描述符共享打開的文件狀態標誌,當前文件偏移量和信號驅動的I/O屬性(請參閱fcntl(2)中的F_SETOWN和F_SETSIG的描述)。
* 子繼承了父節點的打開消息隊列描述符集的副本(請參閱mq_overview(7))。子代中的每個描述符都指向與父代中相應描述符相同的開放消息隊列描述。這意味着這兩個描述符共享相同的標誌(mq_flags)。
* 孩子繼承父級打開目錄流集的副本(請參閱opendir(3))。 POSIX.1-2001表示父級和子級中的相應目錄流可以共享目錄流定位;在Linux/glibc上他們沒有。
我直接去了手冊頁,但它只是有點難以破譯。 –
「孩子繼承了父節點的打開文件描述符集合的副本,子節點中的每個文件描述符都指向父節點中相應的文件描述符(參見open(2)),這意味着兩個描述符共享打開的文件狀態標誌,當前文件偏移量和信號驅動的I/O屬性(請參閱fcntl(2)中的F_SETOWN和F_SETSIG的說明)。「 –
- 1. WoW64進程是否可以創建/ fork/etc純x64進程?
- 2. Dosbox創建別名
- 3. 是否有可能創建永久的對象別名
- 4. 什麼是創建別名或標準
- 5. 用fork創建MPI進程?
- 6. 批量創建別名?
- 7. bash別名無法創建
- 8. 爲函數創建別名
- 9. 在emacs中創建別名?
- 10. lodash別名:是否使用?
- 11. 如何在SQL中創建視圖爲列名創建別名?
- 12. 在fork中檢測子進程創建()
- 13. PHP庫輕鬆創建進程(fork)
- 14. MongoClient在fork之前打開。創建MongoClient
- 15. 使用execl和fork創建linux環境()
- 16. 如何在Cocoa中創建別名?符號鏈接是否足夠好?
- 17. 是否有可能在Delphi中爲泛型類創建類型別名
- 18. Ms-Access:連接,創建別名,使用別名
- 19. Rust是否支持fork()跨平臺?
- 20. Grails fork是否使用端口8080?
- 21. 在SQL Server中創建別名
- 22. 爲'git add remote ...'創建魚別名'
- 23. Zend Framework - 路由器 - 創建別名
- 24. SQLite創建表的ROWID的別名
- 25. 創建LINQ中使用別名的SelectMany
- 26. 爲背景顏色創建別名
- 27. 如何爲mercurial用戶創建別名?
- 28. 如何創建一個別名正確
- 29. 創建永久別名bash命令
- 30. 在java中創建變量別名
在孩子的指針持有相同的地址在父指針。它指向的地址在孩子和父母中都保持相同的數據。如果其中一個進程寫入該值,則在該進程中會有所不同,但不會在其他進程中進行寫入。如果一個進程從FILE *中讀取,則其FILE *的內部副本被更新(例如,它在文件中的位置),但不在另一個進程中。但是,在兩個進程中都可以看到修改底層文件描述符的任何內容。 –
所以指針指向相同的值,但同一個值的兩個不同的副本?這是我很好奇的,當我讀到你的評論時,你說的是什麼? –
指針*具有相同的值,它們指向的*在每個進程中返回的即時fork()處都相同。之後會發生什麼取決於每個過程:他們的地址空間是不同的。 – EJP