当前位置: 首页 > news >正文

os模块篇(十八)

文章目录

  • os._exit(n)
  • os.forkpty()
  • os.kill(pid, sig, /)
  • os.killpg(pgid, sig, /)
  • os.nice(increment, /)
  • os.pidfd_open(pid, flags=0)
  • os.plock(op, /)
  • os.popen(cmd, mode='r', buffering=-1)
  • os.posix_spawn(path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)
  • os.posix_spawnp(path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)

os._exit(n)

os._exit(n) 是 Python 的一个内建函数,用于立即终止当前进程。这个函数与 sys.exit(n) 有所不同,主要表现在以下几点:

  • 终止进程的方式:

    • os._exit(n):这是一个更低级别的函数,它会立即终止当前进程,不执行任何清理操作,如 finally 块或 atexit 钩子。
    • sys.exit(n):这个函数会抛出一个 SystemExit 异常。如果这个异常在主程序中被捕获,那么程序可以执行一些清理操作然后退出。如果 SystemExit 异常没有被捕获,那么程序会终止。
  • 返回值:

    • os._exit(n):它接受一个整数作为参数,这个整数用作进程的退出状态。在 Unix 和 Linux 系统中,退出状态 0 通常表示成功,非零值表示出现了某种错误。
    • sys.exit(n):它也接受一个参数,但通常是一个对象,这个对象将被转换为 None 或一个整数,然后作为退出状态。
  • 用途:

    • os._exit(n):通常在子进程中使用,或者当你需要立即终止程序,而不关心任何后续清理工作时使用。
    • sys.exit(n):在大多数情况下,这是更合适的退出方式,因为它允许你执行一些清理工作,并可能捕获 SystemExit 异常以执行额外的逻辑。

注意:在 Python 的官方文档中,os._exit() 被标记为“内部使用”,这意味着它可能不是为公共使用而设计的,并且在未来的版本中可能会有所变化。因此,除非你有特殊的需求,否则通常建议使用 sys.exit()。

os.forkpty()

os.forkpty() 是 Python 的 os 模块中的一个函数,它用于创建一个新的进程,并且这个新进程会连接到一个伪终端(pseudo-terminal,简称 pty)。伪终端是一种在父进程和子进程之间提供类似终端行为的机制。os.forkpty() 主要用于实现类似 shell 那样的交互式环境。

函数的原型如下:

os.forkpty(master_fd, name, termios=None, winsize=None)

参数说明:

  • master_fd:一个可选的文件描述符,如果提供,则它会被设置为新创建的伪终端的主设备。如果不提供,函数会返回一个新的文件描述符。
  • name:一个可选的字符串,指定伪终端从设备的路径名。通常不需要指定,可以设置为 None。
  • termios:一个可选的 termios 结构体,用于设置从设备的终端属性。通常不需要指定,可以设置为 None。
  • winsize:一个可选的元组,用于设置从设备的窗口大小。通常不需要指定,可以设置为 None。

返回值:

  • 如果成功,该函数返回两次,一次在父进程中,一次在子进程中。在父进程中,它返回子进程的 PID。在子进程中,它返回 0。
  • 如果出现错误,则抛出 OSError 异常。

这是一个使用 os.forkpty() 的简单示例:

import os
import sysdef child_process():# 子进程中的代码print("Hello from child process!", file=sys.stderr)if __name__ == "__main__":try:master_fd, slave_name = os.forkpty()except OSError as e:print(f"Failed to forkpty: {e}")sys.exit(1)if master_fd is not None:# 父进程中的代码pid, status = os.waitpid(master_fd, 0)if os.WIFEXITED(status):print(f"Child exited with code {os.WEXITSTATUS(status)}")elif os.WIFSIGNALED(status):print(f"Child terminated by signal {os.WTERMSIG(status)}")else:# 子进程中的代码child_process()os._exit(0)

在这个例子中,父进程创建了一个新的伪终端,并等待子进程结束。子进程通过标准错误输出打印一条消息,然后正常退出。父进程收集子进程的退出状态,并打印相关信息。

请注意,os.forkpty() 只在 Unix-like 系统(如 Linux、macOS)上可用,它不是 Windows 平台的一部分。

os.kill(pid, sig, /)

os.kill() 是 Python 的 os 模块中的一个函数,用于向指定的进程发送一个信号。这个函数接收两个参数:

  • pid:一个整数,表示要接收信号的进程的进程ID(PID)。
  • sig:一个整数,表示要发送的信号的类型。

在 Unix 和 Linux 系统上,信号是一种进程间通信的机制,它允许一个进程向另一个进程发送一个消息,以通知它某种事件的发生。这些信号可以是操作系统定义的,也可以是用户自定义的。例如,SIGKILL 信号用于立即终止进程,而 SIGTERM 信号用于请求进程正常终止。

os.kill() 函数将 sig 信号发送给 pid 指定的进程。如果进程成功接收到信号,则函数返回 None。如果进程不存在,或者进程没有权限接收该信号,则会引发 PermissionError 或 ProcessLookupError。

这里有一个简单的例子,演示了如何使用 os.kill() 函数发送 SIGTERM 信号来请求终止一个进程:

import os# 假设你有一个进程ID,比如 1234
pid = 1234# 发送 SIGTERM 信号给这个进程
try:os.kill(pid, os.SIGTERM)print(f"SIGTERM signal sent to process {pid}")
except ProcessLookupError:print(f"Process {pid} does not exist")
except PermissionError:print(f"Permission denied to send signal to process {pid}")

注意,不是所有的信号都可以被所有进程安全地接收。有些信号,如 SIGKILL(os.SIGKILL),只能由具有适当权限的进程(通常是超级用户)发送给其他进程。

在发送信号之前,你应当确保你了解信号的行为以及它可能对目标进程产生的影响。不当的信号使用可能会导致数据丢失、进程异常终止或其他不可预期的行为。

os.killpg(pgid, sig, /)

os.killpg(pgid, sig) 是 Python 的 os 模块中的一个函数,用于向指定的进程组发送一个信号。这个函数主要用于 Unix 和类 Unix 系统,如 Linux。

参数说明:

  • pgid:一个整数,表示要接收信号的进程组的 ID。
  • sig:一个整数,表示要发送的信号的类型。

在 Unix 和 Linux 系统上,进程可以被组织成进程组,每个进程组都有一个唯一的进程组 ID(PGID)。进程组允许用户通过向整个组发送信号来管理一组相关的进程。

os.killpg() 函数将 sig 信号发送给 pgid 指定的进程组中的所有进程。如果成功,函数返回 None;如果进程组不存在或无法发送信号,则会引发 OSError。

这是一个使用 os.killpg() 的简单示例:

import os# 假设你知道一个进程组的 ID,比如 1234
pgid = 1234# 发送 SIGTERM 信号给这个进程组中的所有进程
try:os.killpg(pgid, os.SIGTERM)print(f"SIGTERM signal sent to process group {pgid}")
except OSError as e:print(f"Failed to send signal to process group {pgid}: {e}")

请注意,发送信号到进程组需要适当的权限,并且不是所有的信号都可以安全地发送到所有类型的进程。不当的使用可能会导致系统不稳定或数据损坏。

此外,os.killpg() 只在 Unix-like 系统(如 Linux、macOS)上可用,它不是 Windows 平台的一部分。在 Windows 上,进程和进程组的概念与 Unix-like 系统有所不同,因此没有直接的等价函数。

os.nice(increment, /)

os.nice(increment) 是 Python 中 os 模块的一个函数,用于改变当前进程的“nice”值。在 Unix 和类 Unix 系统(如 Linux)中,nice 值是一个用于调整进程优先级的机制。nice 值范围通常是 -20(最高优先级)到 19(最低优先级)。

当你调用 os.nice(increment) 时,当前进程的 nice 值会增加 increment。如果 increment 是正数,那么进程的优先级会降低(即变得更加“nice”,意味着它会更少地占用 CPU 资源,让其他进程有更多的机会运行)。如果 increment 是负数,那么进程的优先级会提高。

这个函数通常用于那些不需要很多 CPU 资源的进程,或者那些希望主动降低自己优先级的进程。

这里是一个简单的示例:

import os# 获取当前进程的 nice 值
current_nice = os.getpriority(os.PRIO_PROCESS, os.getpid())
print(f"Current nice value: {current_nice}")# 增加 nice 值,降低进程优先级
os.nice(5)# 再次获取 nice 值以确认改变
new_nice = os.getpriority(os.PRIO_PROCESS, os.getpid())
print(f"New nice value: {new_nice}")

在这个例子中,我们首先使用 os.getpriority() 函数获取当前进程的 nice 值,然后调用 os.nice(5) 来增加 nice 值,最后再次调用 os.getpriority() 来确认 nice 值已经改变。

请注意,os.nice() 的实际效果可能取决于操作系统的调度策略和其他因素,它并不保证一定会降低进程的优先级。此外,这个函数仅适用于 Unix 和类 Unix 系统,Windows 平台不支持此功能。

os.pidfd_open(pid, flags=0)

os.pidfd_open(pid, flags=0) 是 Python 的 os 模块中的一个函数,用于打开一个进程ID(PID)的文件描述符。这个函数在 Python 3.10 版本中引入,它提供了一种新的机制来跟踪和管理进程,特别是在子进程创建和父进程需要等待子进程结束的场景中。

参数说明:

  • pid:一个整数,表示要打开其文件描述符的进程的进程ID。
  • flags:一个可选的整数,用于指定打开文件描述符时的行为。默认为0,表示使用默认行为。

os.pidfd_open() 函数返回一个文件描述符(一个整数),它可以用于通过文件描述符接口来管理进程。例如,可以使用 os.read() 和 os.write() 函数来读取和写入文件描述符,或者使用 os.close() 函数来关闭文件描述符。

这个函数的主要用途是在父进程中跟踪子进程的状态。通过获取子进程的 PID 文件描述符,父进程可以等待子进程结束,而无需轮询或使用其他机制。此外,文件描述符可以传递给其他进程,从而提供了一种在进程之间传递进程ID的机制。

下面是一个简单的示例,演示了如何使用 os.pidfd_open() 函数来跟踪子进程的结束:

import os# 创建一个子进程
pid = os.fork()if pid == 0:# 子进程执行的代码print("Child process running with PID:", os.getpid())
else:# 父进程执行的代码# 获取子进程的 PID 文件描述符pidfd = os.pidfd_open(pid)# 等待子进程结束os.waitpid(pidfd, 0)# 关闭 PID 文件描述符os.close(pidfd)print("Child process has exited")

在这个示例中,父进程使用 os.fork() 创建了一个子进程。然后,父进程使用 os.pidfd_open() 获取子进程的 PID 文件描述符,并使用 os.waitpid() 等待子进程结束。最后,父进程关闭了 PID 文件描述符。

请注意,os.pidfd_open() 函数是 Python 3.10 中引入的新功能,因此在较旧的 Python 版本中可能不可用。此外,由于这个函数使用文件描述符来管理进程,因此在使用时需要注意文件描述符的管理和错误处理。

os.plock(op, /)

os.plock() 是 Python 的 os 模块中的一个函数,用于在文件上设置或释放建议性的锁。这个函数在 Python 3.3 版本中被引入,并且在某些操作系统上可能不可用。它提供了一个机制,允许程序在文件上设置一个锁,以防止其他程序同时访问该文件。

参数说明:

  • op:一个整数,表示要执行的操作。它可以是以下值之一:
    • os.PLOCK_ADVISE:设置建议性锁,以指示其他进程在尝试访问文件时应该考虑锁的存在。
    • os.PLOCK_ONFAULT:设置建议性锁,以在文件访问出错时通知调用进程。
    • os.PLOCK_OFFFAULT:释放之前设置的 os.PLOCK_ONFAULT 锁。
    • os.PLOCK_ADVISE_NONBLOCK:非阻塞版本的 os.PLOCK_ADVISE。

os.plock() 函数返回一个布尔值,指示操作是否成功。如果操作失败,它将返回 False,并可能设置全局错误变量 errno 来指示失败的原因。

下面是一个使用 os.plock() 的示例:

import os# 打开一个文件用于读写
with open('example.txt', 'r+') as file:# 尝试在文件上设置一个建议性锁if os.plock(os.PLOCK_ADVISE):print("Lock successfully acquired")# 执行需要锁的操作# ...# 释放锁os.plock(os.PLOCK_OFFFAULT)print("Lock released")else:print("Failed to acquire lock")

在这个示例中,我们尝试在文件 example.txt 上设置一个建议性锁,并在成功获取锁后执行一些操作,然后释放锁。

需要注意的是,os.plock() 设置的锁是建议性的,这意味着它不会阻止其他进程实际访问文件。相反,它提供了一种机制,允许进程在尝试访问文件时检查锁的存在,并据此决定是否继续访问或等待。因此,它主要依赖于使用它的程序来遵守锁的存在,而不是由操作系统强制执行。

此外,由于 os.plock() 的行为可能因操作系统而异,并且不是所有操作系统都支持此功能,因此在编写依赖于它的代码时应该格外小心。在编写跨平台的代码时,可能需要使用其他机制来实现文件锁定,例如使用文件锁(file locking)机制,或者依赖于特定于平台的API。

os.popen(cmd, mode=‘r’, buffering=-1)

os.popen(cmd, mode=‘r’, buffering=-1) 是 Python 中 os 模块的一个函数,它用于从一个子进程执行一个 shell 命令,并返回一个文件对象,你可以通过这个文件对象来读取命令的输出或向其写入输入。这个函数提供了一个方便的方法来执行外部命令并与之交互。

参数说明:

  • cmd:要执行的 shell 命令,作为一个字符串传递。
  • mode:可选参数,指定文件对象的模式。默认为 ‘r’,表示读取命令的输出。如果设置为 ‘w’,则可以向命令写入输入。
  • buffering:可选参数,指定缓冲策略。默认为 -1,表示使用系统默认的缓冲策略。也可以设置为 0 表示无缓冲,或者一个正整数指定缓冲大小。

os.popen() 函数返回一个类似于文件对象的 Popen 对象,你可以使用 read()、readline()、readlines() 等方法来读取命令的输出,或者使用 write() 方法向命令写入输入。

下面是一个简单的示例,演示如何使用 os.popen() 来执行一个 shell 命令并读取其输出:

import os# 执行 ls 命令并读取输出
with os.popen('ls') as f:output = f.read()print(output)# 执行一个需要输入的命令,例如 cat 命令,并写入输入
with os.popen('cat', 'w') as f:f.write('Hello, world!\n')f.close()  # 必须关闭文件对象以确保所有数据都被写入# 注意:上述 cat 命令示例可能不会按预期工作,因为当你写入数据后,cat 命令可能立即退出,
# 你可能看不到输出。为了看到输出,你可能需要重定向 cat 命令的输出到一个文件或其他地方。

请注意,os.popen() 在某些情况下可能不是执行外部命令的最佳选择。例如,它不支持直接获取命令的退出状态码,而且可能不如使用 subprocess 模块灵活和强大。subprocess 模块提供了更全面的功能来启动和管理子进程,包括错误处理、输入/输出重定向和进程通信等。如果你需要更复杂的控制或需要更详细的错误信息,建议考虑使用 subprocess 模块。

os.posix_spawn(path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)

os.posix_spawn() 是 Python 的一个底层操作系统接口,用于创建新的进程。这个函数提供了一种更加灵活和强大的方式来创建子进程,比使用 os.fork() 和 os.exec() 组合更为高效。

以下是 os.posix_spawn() 函数的参数解释:

  • path: 要执行的程序的路径。
  • argv: 一个列表,表示要传递给新进程的参数。argv[0] 通常是程序的名称,argv[1:] 是传递给程序的参数。
  • env: 一个字典,表示新进程的环境变量。

以下参数是可选的:

  • file_actions: 一个可选的文件操作列表,这些操作将在新进程开始执行之前和之后执行。这可以包括打开文件、关闭文件、重定向文件描述符等。
  • setpgroup: 如果设置为 True,则新进程将成为其进程组的新领导。如果是一个正整数,则新进程将加入该进程组,并成为其领导。
  • resetids: 如果设置为 True,则在新进程中重置其用户ID、组ID和进程组ID。
  • setsid: 如果设置为 True,则新进程将创建一个新的会话。
  • setsigmask: 一个信号掩码元组,表示在新进程中要阻塞的信号。
  • setsigdef: 一个信号到处理程序的映射,表示在新进程中要设置的信号处理程序。
  • scheduler: 如果指定,则设置新进程的调度策略。

这个函数的返回值是一个整数,表示新进程的进程ID,或者在出现错误时返回 -1 并设置 errno。

请注意,os.posix_spawn() 在所有平台上可能并不可用。特别是在 Windows 上,这个函数是不可用的。在使用它之前,建议检查其可用性。

os.posix_spawnp(path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)

os.posix_spawnp() 是 Python 的另一个用于创建新进程的函数,它与 os.posix_spawn() 类似,但有一个关键的区别:os.posix_spawnp() 会使用 PATH 环境变量来查找要执行的程序。这意味着你可以直接传递程序的名称(而不是完整的路径)作为 path 参数,系统会在 PATH 中查找该程序。

以下是 os.posix_spawnp() 函数的参数解释:

  • path: 要执行的程序的名称。由于该函数会使用 PATH 环境变量来查找程序,因此不需要提供完整的路径。
  • argv: 一个列表,表示要传递给新进程的参数。argv[0] 通常是程序的名称,argv[1:] 是传递给程序的参数。
  • env: 一个字典,表示新进程的环境变量。

其余的参数与 os.posix_spawn() 相同:

  • file_actions: 可选的文件操作列表。
  • setpgroup: 控制新进程的进程组设置。
  • resetids: 是否重置新进程的用户ID、组ID和进程组ID。
  • setsid: 是否创建新的会话。
  • setsigmask: 设置新进程中要阻塞的信号。
  • setsigdef: 设置新进程中的信号处理程序。
  • scheduler: 设置新进程的调度策略(如果支持的话)。

返回值和错误处理与 os.posix_spawn() 相同:成功时返回新进程的进程ID,失败时返回 -1 并设置 errno。

请注意,由于 os.posix_spawnp() 依赖于 PATH 环境变量来查找程序,因此如果 PATH 没有正确设置,或者程序不在 PATH 中,该函数将失败。此外,和 os.posix_spawn() 一样,os.posix_spawnp() 在所有平台上可能并不可用,特别是在 Windows 上。在使用之前,建议检查其可用性。

相关文章:

os模块篇(十八)

文章目录 os._exit(n)os.forkpty()os.kill(pid, sig, /)os.killpg(pgid, sig, /)os.nice(increment, /)os.pidfd_open(pid, flags0)os.plock(op, /)os.popen(cmd, moder, buffering-1)os.posix_spawn(path, argv, env, *, file_actionsNone, setpgroupNone, resetidsFalse, set…...

Oracle 数据库工作中常用知识点:sql语法与常用函数

.to_date()函数 to_date函数是Oracle特有的函数,该函数用来做日期转换。 举例: SELECT TO_DATE(‘2006-05-01 19:25:34’, ‘YYYY-MM-DD HH24:MI:SS’) FROM DUAL   日期格式:     YYYY、YYY、YY 分别代表4位、3位、2位的数字年    …...

软件工程

开发模型 瀑布模型 用于结构化模型开发 适用需求明确或者二次开发 原型模型 适用需求不明确 演化模型 增量模型 适用需求不明确 先做一块,再做一块,这样不断的对核心功能的审视,降低风险 螺旋模型 由多个模型组合成 适用需求不明…...

【御控物联】JavaScript JSON结构转换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么?二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…...

免注册,ChatGPT可即时访问了!

AI又有啥进展?一起看看吧 Apple进军个人家用机器人 Apple在放弃自动驾驶汽车项目并推出混合现实头显后,正在进军个人机器人领域,处于开发家用环境机器人的早期阶段 报告中提到了两种可能的机器人设计。一种是移动机器人,可以跟…...

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能(Generative AI)正以前所未有的速度改变着各行各业的运作模式。其中,游戏产业作为科技应用的前沿阵地,正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业,以及这一变革背后的深远影响。…...

ubuntu23设置kibana后台启动服务

要在Ubuntu 23系统中设置Kibana作为系统服务,以便能够通过systemd管理其启动、停止、重启以及设置开机自动启动,可以按照以下步骤操作: 1. 创建Kibana systemd服务单元 创建一个名为kibana.service的文件在 /etc/systemd/system/ 目录下&am…...

身份证实名制、C#身份核验代码示例、身份证查询

在以前,企业采用人工审核的方式对线上用户进行身份信息真伪的核验,在用户上传身份信息后,人工进行后台审核,虽能满足企业对用户实名认证的需求,但效率慢、耗时长,且存在一定的人为误差,对高度PS…...

【leetcode面试经典150题】15.分发糖果(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...

Elasticsearch如何选择版本

不同版本的ES差异非常大,包括不局限于ES语法、架构、API、集群搭建等等。这些差异足以导致不同版本是否能满足你的业务场景以及后续开发维护成本等各种问题。 先说结论,以个人实践经验及综合考虑推荐使用 7.x 版本中的 7.10版本 ES版本对比 以下是通过…...

P8749 [蓝桥杯 2021 省 B] 杨辉三角形

[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1 , 1 , 1 , 1 , 2 , 1 , 1 , 3 , 3 , 1 , 1 , 4 , 6 , 4 , 1 , … 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1, …...

MySQL数据库——1.创建数据库

在 MySQL 数据库中,要创建一个新的数据库,可以使用 SQL 命令 CREATE DATABASE。创建数据库是管理数据的第一步,它提供了一个容器,用于存储表、视图、存储过程等数据库对象。 示例: CREATE DATABASE my_database; 在…...

计算机视觉研究院 | Drone-YOLO:一种有效的无人机图像目标检测

本文来源公众号“计算机视觉研究院”,仅用于学术分享,侵权删,干货满满。 原文链接:Drone-YOLO:一种有效的无人机图像目标检测 无人机图像中的目标检测是各个研究领域的重要基础。然而,无人机图像带来了独…...

[C#]使用OpencvSharp去除面积较小的连通域

【C介绍】 关于opencv实现有比较好的算法,可以参考这个博客OpenCV去除面积较小的连通域_c#opencv 筛选小面积区域-CSDN博客 但是没有对应opencvsharp实现同类算法,为了照顾懂C#编程同学们,因此将 去除面积较小的连通域算法转成C#代码。 方…...

联邦学习目前面临的挑战以及解决方案

学习目标: 联邦学习目前面临的挑战以及解决方案 学习内容: 联邦学习是一种新兴的人工智能基础技术,它在保障大数据交换时的信息安全、保护终端数据和个人数据隐私、保证合法合规的前提下,在多参与方或多计算结点之间开展高效率的…...

Day60:WEB攻防-XMLXXE安全无回显方案OOB盲注DTD外部实体黑白盒挖掘

目录 XML&XXE-传输-原理&探针&利用&玩法 XXE 黑盒发现 XXE 白盒发现 XXE修复防御方案 有回显 无回显 XML&XXE-黑盒-JSON&黑盒测试&类型修改 XML&XXE-白盒-CMS&PHPSHE&无回显 知识点: 1、XXE&XML-原理-用途&…...

解锁网络安全新境界:雷池WAF社区版让网站防护变得轻而易举!

网站运营者的救星:雷池WAF社区版 ️ 嘿朋友们!今天我超级激动要跟你们分享一个神器——雷池WAF社区版。这个宝贝对我们这帮网站运营者来说,简直就是保护伞! 智能语义分析技术:超级侦探上线 先说说为啥我这么稀饭它。雷…...

RabbitMQ安装详细教程

(一)在Windows系统上安装Erlang的步骤如下: 打开Erlang的官方下载页面,选择适合你的Windows系统的版本进行下载。 下载完成后,双击运行下载的.exe文件,进入Erlang的安装向导。 在安装向导中,按…...

如何快速写出一个完整的测试用例

测试用例是为了验证软件功能或需求而设计的一组测试输入、执行条件和预期结果。编写测试用例的目的是确保测试过程全面高效、有据可查。 一般来说,编写测试用例的流程包括以下几个步骤: 分析需求:阅读需求文档,理解软件的功能和业…...

Docker容器与虚拟化技术:OpenEuler 部署 ES 与 Kibana

目录 一、实验 1.环境 2.OpenEuler 部署 ES (EalasticSearch) 3.OpenEuler 部署 Kibana 4.部署 Elasticvue插件 5.使用cpolar内网穿透 6.使用Elasticvue 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 1…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...

用鸿蒙HarmonyOS5实现国际象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL(Software OpenGL)‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...