Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
tutorial:autorun_options:zh [2023/12/03 09:59]
hfsr [线程]
tutorial:autorun_options:zh [2023/12/03 10:16]
hfsr [交互式Shell启动 (.shrc)]
Line 48: Line 48:
 事件注册记录分为**侦听器**与事件**定时器**两类。 事件注册记录分为**侦听器**与事件**定时器**两类。
  
-请回顾event(事件) 运行库的[[api:​event:​zh|api文档]]。事件注册记录是理想的开发后台“响应程序”的解决方案。“响应程序”指为响应某些预期的事件信号而编写的短期任务。+请回顾event(事件) 运行库的[[api:​event:​zh|API文档]]。事件注册记录是理想的开发后台“响应”的解决方案。“响应”指为响应某些预期的事件信号而启动的短期任务。
  
 ===事件注册记录是可重入的=== ===事件注册记录是可重入的===
Line 72: Line 72:
 回调函数也可以选择返回`false`(`nil`与此不同,必须为`false`)以注销自身。返回其他值或不返回任何值则不会注销回调函数。定时器会在调用次数达到`times`(第三个参数)时自动注销。 回调函数也可以选择返回`false`(`nil`与此不同,必须为`false`)以注销自身。返回其他值或不返回任何值则不会注销回调函数。定时器会在调用次数达到`times`(第三个参数)时自动注销。
  
-这种可重入的行为有助于编程以基于事件执行小的重复的任务,但是不便于构建长期在后台运行的,需要完成多种不同任务的系统。事件注册记录可能不适用于需要保持状态的或者完成大量工作的,以及与系统事件完全无关的程序。显然,上述内容并不是规定,只是一些未考虑你特殊需求背景的主观考虑+这种可重入的行为模式适合基于事件执行小的重复出现的任务,但是不便于构建长期在后台运行的,需要完成多种不同任务的系统。事件注册记录可能不适需要保持状态的或者完成大量工作的,以及与系统事件完全无关的程序。显然,上述内容并不是规定,只是一些未考虑你特殊需求背景的主观意见
  
 ===事件注册记录是轻量化的=== ===事件注册记录是轻量化的===
  
-不像线程,事件注册系统的性能开销很少。最基础的注册`event.listen("​key_down",​ function()end)`可以做到只消耗 400 字节的内存(你可能会觉得这也是很大的开销,那么欢迎进入Lua虚拟机的世界)。OpenOS已经使用了很多事件注册记录,并且系统已经围绕这些注册记录进行了深度优化,以增加可靠性与减少内存开销。+不像线程,事件注册系统的性能开销很少。最基础的注册记录`event.listen("​key_down",​ function()end)`可以做到只消耗400字节的内存(你可能会觉得这也是很大的开销,那么欢迎进入Lua虚拟机的世界)。OpenOS已经使用了很多事件注册记录,并且系统已经围绕这些注册记录进行了深度优化,以增加可靠性与减少内存开销。
  
 ===事件注册记录是阻塞式的=== ===事件注册记录是阻塞式的===
  
-如果你刚才跳过了,那么请阅读前文的[[tutorial:​autorun_options:​zh#​阻塞式调用|阻塞式调用]]部分。在启动时,OpenOS运行在个init线程上,并且如果线程中的任何部分进行了系统退让调用`computer.pullSignal`(或者其他调用此函数的方法,例如`event.pull`),此线程中创建的所有事件注册记录都会暂停。因此,如果你还想让你的系统对前台应用(例如shell)作出响应,那么在事件注册记录里面调用`os.sleep`就很不明智。+如果你刚才跳过了,那么请阅读前文的[[tutorial:​autorun_options:​zh#​阻塞式调用|阻塞式调用]]部分。如前文所述,OpenOS运行在个init线程上,并且如果线程中的任何部分进行了系统退让调用`computer.pullSignal`(或者其他调用此函数的方法,例如`event.pull`),此线程中创建的所有事件注册记录都会暂停。因此,只要你还想让你的系统对前台应用(例如shell)作出响应,那么在事件注册记录里面调用`os.sleep`就很不明智。
 =====用于自动执行程序的进入点===== =====用于自动执行程序的进入点=====
  
 下列的进入点就像“钩子”,或者脚本位置。通过这些进入点你可以在电脑启动时运行你的后台或前台应用。 下列的进入点就像“钩子”,或者脚本位置。通过这些进入点你可以在电脑启动时运行你的后台或前台应用。
  
-====交互式Shell启动运行脚本 (.shrc)====+====交互式Shell启动.shrc====
  
-引导启动的最后一步是加载OpenOS shell。shell会阻塞等待有tty输出可用。这意味着如果没有GPU或屏幕,shell启动将会等待。+引导启动的最后一步是加载OpenOS shell。shell会阻塞等待,直到有tty输出可用。这意味着如果没有GPU或屏幕,shell启动将会进行等待。
  
-在用于tty的stdout可用后,shell会完成加载,并且执行`/​etc/​profile.lua`,此脚本将会加载别名以及设置环境变量。`/​etc/​profile.lua`脚本做的最后一件事是[[https://​ss64.com/​bash/​source.html|“source”]](读取并执行)你的`/​home/​.shrc`文件,此文件默认为空。`source`不会执行Lua代码,而是将文件中的每一行作为shell命令运行。如果你有一个想在shell加载时运行的脚本,那么可以将指向此脚本的路径输入你的`.shrc`文件中。`.shrc`会在每次shell加载时运行,也就是说每次引导启动可能不止执行一次。因为用户可以输入 `exit`、`^d`甚至可以发送硬中断信号来杀死shell程序(然后init进程会加载一个新的shell)。+在用于tty的stdout可用后,shell会完成加载,并且执行`/​etc/​profile.lua`,此脚本将会加载别名以及设置环境变量。`/​etc/​profile.lua`脚本做的最后一件事是[[https://​ss64.com/​bash/​source.html|“source”]](读取并执行)你的`/​home/​.shrc`文件,此文件默认为空。`source`不会执行Lua代码,而是将文件中的每一行作为shell命令运行。如果你有一个想在shell加载时运行的脚本,那么可以将指向此脚本的路径输入你的`.shrc`文件中。`.shrc`会在每次shell加载时运行,也就是说每次启动可能不止执行一次。因为用户可以输入`exit`、`^d`甚至可以发送硬中断信号来杀死shell程序(然后init进程会加载一个新的shell)。
  
-我更建议编辑`/​home/​.shrc`而不是`/​etc/​profile.lua`,仅仅为了有序性。+我更建议编辑`/​home/​.shrc`而不是`/​etc/​profile.lua`,仅出于有序性考虑
  
-====Runscripts ​(rc)====+====Runscriptsrc====
  
 请回顾[[api:​rc:​zh|RC文档]]的内容。 请回顾[[api:​rc:​zh|RC文档]]的内容。
  
 `/​bin/​rc`可被用于启用开机启动脚本。RC脚本甚至在没有shell、没有GPU、没有屏幕、没有键盘的系统上也能启动。 `/​bin/​rc`可被用于启用开机启动脚本。RC脚本甚至在没有shell、没有GPU、没有屏幕、没有键盘的系统上也能启动。
-====文件系统的Autorun脚本(autorun.lua)====+====文件系统的Autorunautorun.lua====
  
-在任何文件系统的根目录中你都可以创建名为`autorun.lua`(或者`.autorun.lua`)的文件。当文件系统组件首次被检测到,OpenOS会自动运行此文件。请注意`/​home/​autorun.lua`不在*rootfs*(根文件系统)的根目录中。本段所说的autorun脚本会在文件系统每次被添加到系统时都执行一次(例如,你把带有autorun脚本的软盘拔出再重新插入就会执行一次)。+在任何文件系统的根目录中你都可以创建名为`autorun.lua`(或者`.autorun.lua`)的文件。当文件系统组件首次被检测到,OpenOS会自动运行此文件。请注意`/​home/​autorun.lua`不在**rootfs**(根文件系统)的根目录中。本段所说的autorun脚本会在文件系统每次被添加到系统时都执行一次(例如,你把带有autorun脚本的软盘拔出再重新插入就会执行一次)。
  
-此特性默认启用,并且可以在rw(可读写)模式文件系统禁用,方式是通过调用`filesystem.setAutorunEnabled(false)`,或者直接修改`/​etc/​filesystem.cfg`并加上`autorun=false`。 ​+此特性默认启用,并且可以在安装于rw(可读写)模式文件系统的操作系统中禁用,方式是通过调用`filesystem.setAutorunEnabled(false)`,或者直接修改`/​etc/​filesystem.cfg`并加上`autorun=false`。 ​
  
 ====引导启动脚本(/​boot/​)==== ====引导启动脚本(/​boot/​)====