漫谈Wine之二:Windows的文件操作
windows基本命令及文件操作

windows基本命令及文件操作Windows基本命令及文件操作有:1. cd:切换目录。
例如,cd C:\Users\username\Desktop 将当前目录切换到桌面。
2. dir:查看目录内容。
例如,dir 列出当前目录的文件和子目录。
3. copy:复制文件。
例如,copy file1.txt file2.txt 将file1.txt复制为file2.txt。
4. del:删除文件。
例如,del file.txt 删除file.txt。
5. move:移动文件。
例如,move file.txtC:\Users\username\Documents 将file.txt移动到Documents文件夹。
6. ren:重命名文件。
例如,ren oldname.txt newname.txt 将oldname.txt重命名为newname.txt。
7. mkdir:创建目录。
例如,mkdir newfolder 创建一个名为newfolder的文件夹。
8. rmdir:删除目录。
例如,rmdir folder 删除名为folder的文件夹(只能删除空文件夹)。
9. cls:清屏。
例如,cls 清除命令提示符窗口上的所有输出。
10. type:显示文件内容。
例如,type file.txt 在命令提示符窗口中显示file.txt的内容。
11. echo:在命令行窗口中输出文本。
例如,echo Hello, World! 在命令提示符窗口中输出“Hello, World!”。
12. tasklist:列出当前运行的进程。
例如,tasklist 查看当前正在运行的所有进程。
请注意,上述命令只是Windows中的一些基本命令,还有很多其他的命令和选项可用。
您可以使用“/?” 参数来获取命令的详细用法和选项。
wine使用教程

wine使用教程1、安装Wine在Linux系统中,可以使用包管理器来安装Wine。
不同的Linux发行版可能会有略微不同的指令,常见的是使用apt或者yum命令来安装。
假设我们使用的是apt命令,打开终端并输入以下命令:sudo apt install wine2、配置WineWine安装完成后,我们需要进行一些基本的配置以确保其正常运行。
首先,在命令行中输入以下命令:winecfg这将打开一个配置窗口,我们可以在其中进行一些基本设置,例如更改Windows版本、设置驱动程序等。
3、安装Windows软件一旦配置完成,我们就可以通过Wine来安装和运行Windows 软件。
假设我们有一个Windows安装程序文件(.exe或者.msi),可以在终端中输入以下命令来运行该程序:wine /path/to/program.exe这将在Wine环境中运行该程序,并开始其安装过程。
按照程序的提示进行操作,就可以完成安装。
4、运行Windows应用程序安装完后,我们可以通过以下命令来运行Windows应用程序:wine /path/to/program.exe或者,如果已经创建了桌面快捷方式,可以直接在终端中输入应用程序的名称来运行:wine program.exe5、卸载应用程序如果需要卸载已安装的应用程序,可以使用以下命令来进行卸载:wine uninstaller这将打开一个卸载程序窗口,我们可以在其中选择要卸载的程序,并按照指示进行操作。
6、与Wine相关的常用命令除了上述的基本命令,Wine还提供了一些其他有用的命令。
以下是一些常见的命令及其用法:- winecfg:打开配置窗口- winefile:打开文件浏览器- winepath:转换Windows路径到Linux路径- wineserver:Wine服务器程序管理- wineboot:重启Wine环境总结:Wine是一款在Linux系统上运行Windows应用程序的工具。
如何使用Windows系统进行文件管理

如何使用Windows系统进行文件管理Windows系统是目前全球最广泛使用的操作系统之一,它为用户提供了丰富的功能和工具,包括文件管理。
良好的文件管理对于提高工作效率和保护数据的安全至关重要。
本文将介绍如何使用Windows系统进行文件管理,并按以下几个方面进行详细讨论:文件基本操作、文件夹管理、搜索和整理以及备份和恢复。
一、文件基本操作在Windows系统中,用户可以通过多种方式进行文件基本操作,包括新建、复制、粘贴、删除和重命名等。
1.1 新建文件要新建一个文件,可以通过右键单击所在的文件夹或桌面空白处,在右键菜单中选择“新建”选项,然后选择所需的文件类型,如文本文档或Word文档等。
也可以直接点击桌面空白处按下Ctrl+Shift+N快捷键来新建一个文件。
1.2 复制和粘贴文件要复制文件,可以选中所需文件,使用Ctrl+C快捷键或通过右键菜单中的“复制”选项来完成。
然后,进入目标文件夹,通过Ctrl+V快捷键或右键菜单中的“粘贴”选项将文件粘贴到目标位置。
1.3 删除文件在Windows系统中删除文件非常简单,只需选中文件,然后按下Delete键或通过右键菜单中的“删除”选项即可。
被删除文件会进入回收站,可以进行恢复或永久删除。
1.4 重命名文件重命名文件可以通过右键菜单中的“重命名”选项或选中文件后按下F2键来实现。
用户可以根据需要自定义文件名称,使其更加直观和有序。
二、文件夹管理合理的文件夹管理可以让用户更好地组织和管理文件,提高工作效率。
2.1 新建文件夹用户可以通过右键菜单中的“新建文件夹”选项在当前目录中创建新文件夹。
也可以选中目标文件夹,按下Ctrl+Shift+N快捷键来新建文件夹。
2.2 移动文件夹移动文件夹可以将一组文件或文件夹从一个位置复制到另一个位置。
只需选中所需文件夹,然后将其拖动到目标文件夹,释放鼠标即可完成移动。
2.3 复制文件夹复制文件夹与复制文件类似,只需选中所需文件夹,然后按下Ctrl+C快捷键或通过右键菜单中的“复制”选项来复制文件夹。
掌握Windows系统的文件管理技巧

掌握Windows系统的文件管理技巧第一章介绍Windows系统的文件管理技巧Windows操作系统是大多数个人电脑用户最常用的操作系统之一。
文件管理是使用Windows系统的基本技能之一,它可以帮助我们更高效地组织和查找存储在计算机中的文件和文件夹。
本章将介绍一些掌握Windows系统文件管理技巧的方法和技巧。
第二章使用Windows资源管理器Windows资源管理器是Windows系统中文件和文件夹管理的主要工具。
它允许我们在计算机的硬盘驱动器中创建、删除、剪切、复制和重命名文件和文件夹。
我们还可以使用资源管理器管理桌面和快捷方式。
通过单击开始菜单中的“计算机”或使用Win+E快捷键,我们可以快速打开资源管理器。
资源管理器提供了一个直观的界面,允许我们轻松定位、操作和浏览文件和文件夹。
第三章创建和管理文件夹在Windows系统中,我们可以轻松地创建新文件夹来组织我们的文件。
当我们找到一个适合创建新文件夹的位置后,我们可以右键单击并选择“新建文件夹”。
然后,我们可以为新文件夹指定一个名称。
要重命名文件夹,我们只需右键单击文件夹并选择“重命名”选项。
如果我们不再需要某个文件夹,我们可以右键单击并选择“删除”。
此外,我们还可以将文件夹移动到其他位置,只需将文件夹拖放到目标位置即可。
第四章搜索文件和文件夹Windows系统提供了一个强大的搜索功能,使我们能够快速找到我们的文件和文件夹。
在资源管理器中,我们可以使用搜索框来输入关键字,并根据名称、日期、大小和其他属性来搜索文件。
我们还可以使用搜索选项来更精确地定义搜索条件。
当我们找到我们想要的文件后,我们可以使用右键单击选项来打开、复制、剪切或删除文件。
第五章使用文件和文件夹的属性每个文件和文件夹都有一些属性,可以帮助我们更好地了解它们。
在资源管理器中,我们可以右键单击文件或文件夹并选择“属性”选项来查看这些属性。
属性选项提供了有关文件大小、创建日期、修改日期和最后访问日期的信息。
Windows文件管理技巧

Windows文件管理技巧第一章:基本文件操作技巧Windows操作系统是目前使用最广泛的操作系统之一,掌握一些基本的文件操作技巧能够帮助用户更高效地管理和组织自己的文件。
本章将介绍一些基本的文件操作技巧,包括创建、复制、移动、重命名和删除文件或文件夹。
1.1 创建文件或文件夹在Windows资源管理器中,可以通过右键点击鼠标选择“新建”来创建文件或文件夹。
对于文件,可以选择创建文本文件、Word文档、PowerPoint演示文稿等。
对于文件夹,可以创建一个新的文件夹来组织和分类文件。
1.2 复制文件或文件夹复制文件或文件夹是在Windows中非常常见和重要的操作。
可以通过右键点击鼠标选择“复制”,然后将文件或文件夹粘贴到目标位置。
还可以使用快捷键组合Ctrl+C(复制)和Ctrl+V(粘贴)来实现文件或文件夹的复制。
1.3 移动文件或文件夹移动文件或文件夹可以将它们从一个位置移动到另一个位置。
可以通过右键点击鼠标选择“剪切”,然后将文件或文件夹粘贴到目标位置。
也可以使用快捷键组合Ctrl+X(剪切)和Ctrl+V(粘贴)来实现文件或文件夹的移动。
1.4 重命名文件或文件夹有时候,我们需要修改文件或文件夹的名称。
可以通过右键点击鼠标选择“重命名”,然后输入新的名称。
也可以选中文件或文件夹,然后按下F2键来进行重命名操作。
1.5 删除文件或文件夹当不再需要某个文件或文件夹时,可以通过右键点击鼠标选择“删除”来删除它们。
也可以选中文件或文件夹,然后按下Delete键来进行删除操作。
需要注意的是,一旦删除后,文件或文件夹将无法恢复,请谨慎操作。
第二章:高级文件管理技巧除了基本的文件操作技巧外,Windows还提供了一些高级的文件管理技巧,帮助用户更好地管理和查找文件。
本章将介绍一些高级的文件管理技巧,包括搜索、筛选、排序和压缩文件。
2.1 文件搜索当我们在计算机中有大量文件时,通过手动查找变得非常耗时。
linux wine用法 -回复

linux wine用法-回复使用Wine在Linux上运行Windows应用程序的使用方法# 概述Wine是一个开放源代码的兼容层,允许在Linux操作系统上运行Windows应用程序。
它实际上是一种将Windows API转换为Linux系统调用的软件,使得用户可以在Linux系统中无需安装虚拟机或双启动的情况下运行Windows程序。
本文将一步一步介绍如何安装和配置Wine,以及如何使用它在Linux上运行Windows应用程序。
# 步骤一:安装Wine第一步:更新系统在开始之前,我们首先要确保系统是最新的状态。
打开终端并输入以下命令:sudo apt updatesudo apt upgrade这将更新系统中的所有软件包。
第二步:添加Wine存储库默认情况下,大多数Linux发行版的官方软件仓库中没有Wine。
为了安装最新版本的Wine,我们需要添加Wine的官方存储库。
打开终端并输入以下命令:对于Ubuntu或基于Debian的发行版:sudo dpkg add-architecture i386wget -O - sudo apt-key add -sudo apt-add-repository 'deb focal main'对于Fedora或基于Red Hat的发行版:sudo dnf config-manager add-repo第三步:安装Wine接下来,我们要安装Wine。
打开终端并输入以下命令:对于Ubuntu或基于Debian的发行版:sudo apt updatesudo apt install install-recommends winehq-stable对于Fedora或基于Red Hat的发行版:sudo dnf updatesudo dnf install winehq-stable安装过程可能需要一些时间,取决于您的系统速度和互联网连接速度。
windows 操作系统之文件管理
windows 操作系统之文件管理《Windows 操作系统之文件管理》在我们日常使用电脑的过程中,Windows 操作系统的文件管理是一项至关重要的功能。
它就像是一个有条不紊的管理员,帮助我们妥善地组织、存储、查找和处理各种文件和文件夹。
首先,让我们来了解一下什么是文件和文件夹。
文件可以理解为存储在电脑中的各种信息,比如文档、图片、音频、视频等等。
而文件夹呢,则像是一个个收纳盒,我们可以把相关的文件都放在同一个文件夹里,以便更好地进行分类和管理。
在 Windows 操作系统中,我们可以通过多种方式来创建文件和文件夹。
比如,在桌面上右键单击,选择“新建”,然后就可以选择创建文件(如文本文档、Word 文档等)或者文件夹。
另外,在资源管理器中,也能通过类似的操作来完成创建。
创建好文件和文件夹后,接下来就是给它们取一个合适的名字。
文件名要尽量能够清晰地反映文件的内容,这样在日后查找的时候能够更加方便快捷。
需要注意的是,文件名不能包含一些特殊字符,并且长度也有限制。
文件和文件夹的移动与复制也是常用的操作。
如果我们想要把一个文件从一个位置移动到另一个位置,只需要选中这个文件,然后按住鼠标左键拖动到目标位置即可。
如果是要复制,在拖动的同时按住 Ctrl 键。
有时候,我们不再需要某些文件或文件夹了,就需要进行删除操作。
删除可以通过选中对象后按下 Delete 键来完成。
但这里要特别提醒大家,删除后的文件通常会被放入回收站,如果想要彻底删除,还需要在回收站中再次进行删除操作。
而且,删除操作要谨慎,以免误删重要的文件。
对于重要的文件,我们还可以设置属性来进行保护。
比如,可以将文件设置为只读,这样就无法对其进行修改。
或者隐藏文件,使其在一般的浏览中不显示出来,增加一定的保密性。
在文件管理中,查找文件也是一项重要的技能。
Windows 操作系统提供了强大的搜索功能。
我们可以通过在搜索框中输入文件名、关键词、文件类型等信息来快速找到我们需要的文件。
wine使用方法
wine使用方法Wine 是一种程序装入器,可用于在 UNIX 操作系统上运行Windows 应用程序。
以下是 Wine 的一般使用方法:1. 安装 Wine:在 UNIX 系统中,您可以使用包管理器 (例如apt-get、yum、pacman 等) 来安装 Wine。
例如,在 Ubuntu 上,您可以运行以下命令来安装 Wine:```sudo apt-get install wine```2. 启动应用程序:一旦 Wine 安装完成,您可以使用 Wine 来启动 Windows 应用程序。
例如,如果您要运行 Windows 程序“explorer.exe”,您可以运行以下命令:```wine explorer.exe```3. 设置 Wine 环境变量:为了使 Wine 能够正确运行 Windows 应用程序,您需要设置一些环境变量。
例如,在 Ubuntu 上,您可以运行以下命令来设置 Wine 变量:```sudo env WinePath="C:Windows" wine program.exe```这将在 Ubuntu 上设置 Wine 环境变量,使其能够正确运行Windows 应用程序。
4. 优化 Wine:您可以使用 Wine 优化工具来优化 Wine,以提高其性能。
例如,在 Ubuntu 上,您可以使用以下命令启动 Wine 优化工具:```sudo apt-get install winetrickssudo winetricks optimization```这将启动 Wine 优化工具,并为您提供一些选项,以优化 Wine 性能。
总结起来,Wine 是一种有用的工具,它可以使 UNIX 系统上运行 Windows 应用程序变得更加容易。
如果您需要使用 Windows 应用程序,请尝试使用 Wine 来运行它们。
Windows文件和文件夹管理的基本操作
Windows文件和文件夹管理的基本操作第一章:文件和文件夹的创建与重命名在Windows操作系统中,文件和文件夹是我们日常工作中不可或缺的一部分。
了解如何创建和重命名文件和文件夹是基本的操作技能。
1.1 创建文件和文件夹要创建新的文件,可以在桌面或文件夹中右键点击空白处,选择“新建”,然后选择“文本文档”。
接着,给文件命名,并按下Enter键即可创建文件。
同样的,要创建新的文件夹,右键点击空白处,选择“新建”,再选择“文件夹”。
然后,给文件夹命名即可完成新建操作。
1.2 重命名文件和文件夹对于已存在的文件和文件夹,我们可以随时对其进行重命名。
选中文件或文件夹,然后右键点击,选择“重命名”,然后输入新的名称并按下Enter键即可完成重命名操作。
第二章:文件和文件夹的复制和粘贴在日常工作中,我们经常需要将文件和文件夹从一个位置复制到另一个位置。
了解如何使用Windows的复制和粘贴功能可以提高我们的工作效率。
2.1 复制文件和文件夹要复制文件或文件夹,可以通过右键菜单中的“复制”选项来实现。
选中要复制的文件或文件夹后,右键点击,选择“复制”选项。
接着,导航到要复制到的目标位置,右键点击目标位置,选择“粘贴”选项即可将文件或文件夹复制到目标位置。
2.2 剪切和粘贴文件和文件夹与复制操作类似,剪切和粘贴操作可以将文件和文件夹从一个位置移动到另一个位置。
选中要剪切的文件或文件夹,右键点击,选择“剪切”选项。
然后导航到目标位置,右键点击目标位置,选择“粘贴”选项即可完成移动操作。
第三章:文件和文件夹的删除和恢复在使用Windows进行文件和文件夹管理时,删除和恢复文件是一个常见的操作需求。
了解如何正确地删除文件和文件夹,并可以恢复被删除的文件是非常重要的。
3.1 删除文件和文件夹要删除文件或文件夹,可以选中它们,然后按下“Delete”键。
或者,右键点击文件或文件夹,选择“删除”选项。
一旦删除,文件或文件夹将被发送到“回收站”。
windows操作及文件管理操作步骤
windows操作及文件管理操作步骤嘿,朋友们!今天咱就来唠唠这 Windows 操作和文件管理那些事儿。
你想想看,Windows 系统就像是一个超级大的宝库,里面啥都有,但你得知道怎么去探索它,找到你想要的宝贝呀!先说开机吧,那就是打开宝库大门的钥匙,按一下电源按钮,嘿,Windows 就开始启动啦。
等它准备好了,你就看到了那个熟悉的桌面,就像走进了宝库的大厅。
然后呢,你得学会用鼠标这个小魔杖呀!鼠标左键点击,就像轻轻敲一下门,看看里面有啥;鼠标右键呢,就像是打开了一个隐藏的菜单,各种功能都在里面等你发现。
接下来就是文件管理啦,这可太重要啦!文件就像是宝库里的各种宝贝呀。
你得知道怎么把它们整理好,不然乱七八糟的可不好找。
比如说,你建个文件夹,就像给宝贝们分分类,把一样的放在一起。
给文件夹取个好名字,就像给宝贝们贴上标签,一目了然。
复制粘贴这俩操作,就像是变魔术一样!你可以把一个文件或者文件夹复制一份,然后粘贴到别的地方去,就像把宝贝从一个地方变到另一个地方。
删除呢,可得小心点,别不小心把重要的宝贝给扔了呀!还有搜索功能,哇,那可太方便啦!就像你在宝库里大喊一声你要找的宝贝的名字,它就会自己蹦出来。
再说说窗口操作吧。
窗口就像是一个个小房间,你可以打开好多小房间,然后在里面做不同的事情。
最小化就像是把小房间藏起来,等你要用的时候再打开;最大化呢,就是把小房间变得超级大,让你能看得更清楚。
关闭窗口,那就是离开这个小房间啦。
哎呀呀,这 Windows 操作和文件管理,说起来简单,做起来可得多练练呀!就像你学骑自行车一样,刚开始可能会晃悠,但多骑几次就熟练啦。
你要是不练习,那可就浪费了这么好的宝库呀!你想想,要是你连自己的宝库都管理不好,那多可惜呀!所以呀,赶紧去试试吧,多点点鼠标,多建建文件夹,多复制粘贴几次,你就会发现,哇,原来这么好玩,这么方便呀!别再犹豫啦,赶紧去和你的 Windows 宝库亲密接触吧!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相对而言,一个差强人意的实现是在父进程的用户空间保留一个副本,然后这样:
NtCreateProcess()
{
…… if (不遗传) { //根据副本 close_on_exec 位图
for(每个允许遗传的已打开文件) ioctl(fd, FIOCLEX);
//暂时设置成不遗传
}
fork() if (在父进程中)
2
if (允许遗传) ioctl(fd, FIONCLEX);
else ioctl(fd, FIOCLEX);
}
// exec 时不关闭 //// exec 时关闭
显然,至此为止,这样的实现还是很简洁的。 可是且慢,Windows 允许在创建子进程时再作一次选择。如果选择不遗传,那么所有的 已打开文件都不遗传。而 Linux 却不提供这一次选择,这就是一项比较显著的“核内差异” 了。 那么我们怎么来“核外补”呢?似乎可以这样:先让它遗传,然后再在子进程中把已经 遗传下来的文件关闭掉。可是,这样的实现就谈不上简洁高效了。问题在于子进程并不知道 到底有哪些已打开文件被遗传了下来,所以只好来一个格杀勿论:
其实就这一项“核内差异”而言,上述的方法虽不能说简洁,但是至少还可行,下面这 个问题就更麻烦了。
三、文件访问的跨进程复制 Windows 不仅支持父子进程之间对于已打开文件(对象)有选择的遗传/继承,还支持跨进
程的复制。这种跨进程复制可以在没有“血缘”关系的进程之间进行。Windows 为此提供了 一个系统调用 NtDuplicateObject(),我们看一下它的调用界面:
二、已打开文件的遗传 当一个进程创建一个子进程时,可以将它的一些已打开文件“遗传”给所创建的子进程。
这样,子进程从一开始就取得了对这些文件的访问权和上下文。这一点上 Windows 和 Linux 都是如此。
可是,Windows 内核的这种遗传机制却有着与 Linux 不同的特点,可以归纳成下列要素: 1) 在打开一个文件(实际上是更为广义的“对象”,下同)的时候,可以说明是否允
漫谈 Wine 之二:
Windows 的文件操作
毛德操
对 Wine 的研究不应该孤立地进行,而应该把它放在 Windows(注意,除特别说明者以外, 都是指 WinNT)和 Linux 两个操作系统、特别是两个内核的差异的背景下来开展。这里面的 道理很简单:如果两个内核没有什么差异,或者二者之间存在着简单的映射,那 Wine 的存 在就没有什么意义、没有多大空间了,从而兼容内核也就没有什么必要了。所以,无论是对 于 Wine 的研究,还是对于兼容内核的开发, Windows 和 Linux 的对比研究有着特别重要 的意义。
从表面上看,文件操作不外乎打开文件/关闭文件、读、写、移动指针、冲涮缓冲区, 还有就是对文件加锁/解锁这些操作,变也变不到哪儿去。这里面似乎不会有什么根本的、 结构性的差异。
然而,事情不是那么简单。读者看了我下面列举的一些差异(尽管并不详尽)就会明白这 些差异实在并不简单,从而可以对 Wine 的系统结构和开发兼容内核的主张有更深刻的理解。
这一篇先讲文件操作。
我这里讲 Window 与 Linux 在文件操作方面的差异,还不是指它们在文件系统的结构与 格式方面的差异,而是指应用软件可以对文件作些什么操作、可以怎样来使用文件和文件系 统。也就是说,是指应用软件与操作系统之间的界面、即 API。事实上,这才是更为根本、 更具结构性、因而更显著更重要的差异。
此外,一个进程同时打开的文件数量毕竟有限,而可能要同时打开的“对象”数量可就 大了。
这么一比较,二者的差异就明显了。Unix/Linux 将设备看作文件,而 Windows 进一步 将文件看作对象。显然后者更为一般化,是前者的推广。
单纯由这个因素引起的功能和性能上的差异也许并不大,但是与别的因素结合在一起所 造成的差异就相当可见了。
进一步,我们着眼于两个系统的差异,又特别应该着眼于那些从用户角度“能见度”较 高的差异,即对于系统的功能、性能有较大影响的差异,而对于“能见度”较低的差异就可 以先放一放、甚至可以不太关心。举例来说,在内存管理方面,即虚存空间的划分与使用、 页面的换入/换出这些问题上,两个内核也存在着差异。但是这些问题一般而言对功能、性 能的影响不大,我们就可以把它放到“运动后期”再来考虑。反之如文件操作则“能见度” 相当大,就应该优先考虑。其实,如果我们回顾 Wine 项目的开发历程,也正好可以看到这 么一种策略。
不过,有兴趣于 Wine 或兼容内核、或者来我们这个网站走走看看的人,对于 Linux 多 少都已经有了一些了解和理解,所以我这里将集中谈论 Windows 的一些特点,并与 Linux 中相关的对应物作一些比较;而对 Linux 的这些对应物就不作介绍了,有需要的读者可参考 “Linux 内核源代码情景分析”和其它有关著作。
然而有着一个重要的区别。 作为 Linux“已打开文件号”的下标,是用于一个“打开文件表”的下标,每个进程有 一个“打开文件表”。这个表(数组)中的每一项都代表着一个已经被本进程打开的文件。从
1
Unix 时代开始,设备被看作文件,因而这或者是文件、或者是设备(也包括“虚拟设备”)。 可是,作为 Windows“句柄”的下标,却是用于一个“打开对象表”的下标。虽然也是
{
if (不遗传)
{ //还是根据副本 close_on_exec 位图
for(每个允许遗传的已打开文件)
ioctl(fd, FIONCLEX);
//恢复原状
}
}
……
3
ห้องสมุดไป่ตู้ }
如果选择不遗传,就在 fork()之前先把有关的已打开文件暂时改成不让遗传,然后在 fork()以后由父进程把这些已打开文件的遗传控制位复原。这里的问题是允许遗传的已打开 文件可能很多,所以可能要调用 ioctl()很多次。
许将这个已打开文件(如果成功打开的话)遗传给子进程。 2) 在创建一个子进程的时候,可以规定是否将那些允许遗传的已打开文件遗传给
所创建的子进程。显然,如果需要遗传的话,Windows 内核会扫描父进程的已 打开对象表,把所有允许遗传的表项复制到子进程的已打开对象表中。 总之,这是有选择的遗传和继承,分两次作出选择。 那么 Linux 怎么样? 在 Linux 中,子进程的创建是分两步走的。第一步是通过系统调用 fork()创建一个线程(共 享父进程的用户空间和别的资源)。然后是第二步,通过系统调用 execve()使新创建的线程变 成进程,开始独立拥有自己的用户空间和别的资源,并开始走自己的路。另一个系统调用 system()则只是把 fork()和 execve()、还有 wait4()、组装在一起,因此实际上还是分两步走。 在第一步中的遗传/继承是全面的,父进程所有的已打开文件都遗传给子进程(线程)。而第二 步,其实 Linux 也支持有选择的遗传和继承。Linux 内核的数据结构 struct files_struct 中有个 位图 close_on_exec_init,位图中的遗传控制位(标志位)决定着相应的已打开文件在执行 execve()等系统调用时是否关闭、也即遗传与否。应用程序可以通过系统调用 ioctl()设置具 体已打开文件的遗传控制位,以决定具体已打开文件的遗传特性。 于是,Windows 的打开文件系统调用可以这样实现: NtOpenFile() { …… fd = open();
NTSTATUS NTAPI NtDuplicateObject(
IN HANDLE SourceProcessHandle, IN HANDLE SourceHandle, IN HANDLE TargetProcessHandle, OUT PHANDLE TargetHandle OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG Attributes, IN ULONG Options);
for(ch=0; ch< OPEN_MAX; ch++) close(ch);
这里的 OPEN_MAX 是 Linux 允许一个进程拥有已打开文件的最大数量,定义为 256。 显然,这个办法不好。
读者也许会想,如果我们在用户空间也提供一个位图、作为内核中本进程的 close_on_exec 位图在用户空间的副本,再让 NtOpenFile()在设置内核中的位图时也设置一下 用户空间的副本,最后让子进程根据这个副本位图有针对地关闭文件,这样不就可以提高效 率吗?然而问题在于:一般而言,父进程用户空间的内容是不能遗传给子进程的。实际上, 作为一条准则,凡是要遗传给子进程的东西,就不能只是保存在父进程的用户空间,而必须 保存在别的什么地方,一般是内核中或是另一个进程(例如服务进程)中。
一、打开文件号 要对一个文件进行操作,就得先打开这个文件,在这一点上两个系统(内核)是一致的。
我们知道,Linux 的“已打开文件号”实际上是用于一个指针数组的下标。与此相似,在 Windows 中虽然不称为“已打开文件号”而称为“Handle”(一般译作“句柄”,但是窃以为 不如“把手”更为传神),实质上也是指针数组的下标。这样看来,在这一点上似乎也是一 致的。
这里 SourceProcessHandle 和 TargetProcessHandle 是源和目标两个已打开进程的句柄, 代表着两个进程。调用这个函数的进程本身可以是其中之一,也可以是个“第三者”。 SourceHandle 是源进程的某个已打开文件(对象)的句柄,这个系统调用的目的就是要把源进 程对这个已打开文件的访问通道复制给目标进程,或者说把源进程访问这个文件的上下文复 制给目标进程。而 TargetHandle,则用来返回复制以后该已打开文件在目标进程中的句柄。 不过,调用时也可以通过 TargetHandle 对目标句柄(打开文件号)给出一个建议,所以是 OPTIONAL。至于其余三个参数,则我们在这里并不关心。在典型的应用中有三个进程卷入 此项操作,源和目标两个进程、以及执行此项操作的进程、可以是任意进程(只要访问权限