電腦複製粘貼背後發生了什麼?

當我按下複製的時候,無論文件多大都能瞬間完成操作,我想了解一下當用戶按下複製粘貼之後,計算機都進行了什麼樣的操作,win,linux有什麼異同點么? 謝謝


Update:調整了順序,添加了詳細的過程介紹,修改了之前偷懶的代碼


謝邀,Linux下不太熟悉,Windows下可以參考MSDN上的解釋:Clipboard (Windows)。

Windows下使用剪貼板的過程大致如下:

複製的過程:

1. 初始狀態。

2. 程序A使用 OpenClipboard 打開剪貼板。此時剪貼板被獨佔,無法被其他程序打開。

3. 程序A使用 EmptyClipboard 清空剪貼板。此時剪貼板中原有的數據被清除。

4. 程序A使用 GlobalAlloc 申請一段用於存放數據的全局內存。

5. 程序A使用 GlobalLock、GlobalUnlock 設置全局內存中的數據。

6. 程序A使用 SetClipboardData 將全局內存的句柄設置到剪貼板。

7. 程序A使用 CloseClipboard 關閉剪貼板。此時剪貼板的佔用被解除,其他程序可以訪問剪貼板。程序A關閉後剪貼板中依然有數據。


粘貼的過程:

1. 初始狀態。

2. 程序B使用 OpenClipboard 打開剪貼板。

3. 程序B使用 GetClipboardData 獲取剪貼板中全局內存的句柄。

4. 程序B使用 GlobalLock、GlobalUnlock 獲取全局內存中的數據。

5. 程序B使用 CloseClipboard 關閉剪貼板。


實際上,當你在文件管理器中使用「複製」的時候,並不會真正地將整個文件複製到剪貼板中,只是將文件的路徑存放在了剪貼板中(類型為 CF_HDROP,簡單地說是一個文件列表),當然也不會消耗多少時間。當你「粘貼」的時候,文件管理器才會真正地複製這個文件。

舉例來說,你可以通過下面的代碼來查看當前剪貼板中剛剛「複製」了的文件(C++11代碼):

#include &
#include &
#include &
int main() {
if(OpenClipboard(nullptr)) {
HDROP hdrop = HDROP(GetClipboardData(CF_HDROP));
if(hdrop) {
UINT count = DragQueryFileA(hdrop, -1, nullptr, 0);
for(UINT i = 0; i &< count; ++i) { std::vector& path(DragQueryFileA(hdrop, i, nullptr, 0) + 1);
DragQueryFileA(hdrop, i, path.data(), path.size());
std::cout &<&< path.data() &<&< std::endl; } } CloseClipboard(); } }

效果(隨便選了一些文件):


這邊稍微提一下 Linux 下的剪貼板是怎麼回事。Linux 下的 GUI 程序的剪貼板功能一般是由 X11 提供的(Wayland 沒怎麼用過不知道)。X11 支持複數個剪貼板,每個剪貼板都有一個名字。一般常見/常用的比如 PRIMARY 剪貼板(選中的文本內容會被送到這個剪貼板,一般按滑鼠中鍵可以粘貼)和 CLIPBOARD 剪貼板(更加接近於 Windows 下的剪貼板的存在,Ctrl-C/V 功能一般作用於這個剪貼板)。

此外就是 X11 的剪貼板里的內容似乎是由內容來源的程序來保存的,內容來源程序終止的話剪貼板就會被清空。這時一般需要一個常駐後台的剪貼板管理器(Clipboard Manager)來接管剪貼板的內容。

這邊有個英文的參考資料,簡單描述 X11 的剪貼板:X11: How does 「the」 clipboard work?


在複製時只是將路徑放到剪貼板中,也就是內存中,你可以試試複製一個文件然後在文本編輯器里粘貼,會發現是這個文件的絕對路徑。

評論提醒無法操作,這個不是文本格式的路徑名,還包含了文件的屬性,不能直接當文本來用的


以甲乙兩程序命名,甲複製,複製什麼數據,編碼是啥,甲定;乙粘貼,能否解碼?乙如解不了碼,不能粘貼。乙解碼後需不需要轉碼,這些乙定。比如圖能複製但粘貼不到記事本。剪貼板可用內存可用臨時文件。


推薦閱讀:

為什麼在知乎OSX用戶只要黑半句Windows就招來圍攻,而對待Linuxer卻只有技術層面的反駁?
如何在 SSH 下遠程使用 IDE 編譯和調試?
Linux的前景如何?
linux的epoll_wait以及epoll_ctl是否線程安全?
有哪些 Linux 逆向相關的學習資料推薦?

TAG:Linux | 計算機 | C | Windows10 |