Linux:八种重定向详解(万字长文警告)
相关阅读Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482
本文将讨论Linux中的重定向相关问题,在阅读本文前,强烈建议先学习文件描述符的相关内容Linux:文件描述符详解。
重定向分为两类:第一类是全局重定向,它对后续在Bash中创建的所有子进程都生效(因为文件描述符的继承);第二类是命令重定向,它只对单个命令生效。
全局重定向
输入重定向
exec [number|varname]< filename
# 如果不使用exec,则无法影响当前Bash进程
# [number|varname]和<之间不能有空格
输入重定向会首先将文件名进行拓展(如参数扩展和命令替换),如果使用number,会在文件描述符number上以读模式打开该文件(实际上,系统调用open打开一个文件返回的文件描述符是最小可用的整数值,这是不能直接控制的,但可以用系统调用dup、dup2或fcntl进行复制);如果使用varname,则会自动分配一个大于等于10的文件描述符并将其赋值给变量varname;如果未指定number或varname,则默认为标准输入(文件描述符0)。
例1展示了指定数字分配文件描述符和自动分配文件描述符的过程。
例1
[zhangchen@EDA Desktop]$ psPID TTY TIME CMD34005 pts/0 00:00:00 bash34070 pts/0 00:00:00 ps
[zhangchen@EDA Desktop]$ ls -al /proc/34005/fd # 查询bash进程的文件描述符
total 0
dr-x------. 2 zhangchen zhangchen 0 Sep 24 14:08 .
dr-xr-xr-x. 9 zhangchen zhangchen 0 Sep 24 14:08 ..
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 0 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 1 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 2 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:09 255 -> /dev/pts/0
[zhangchen@EDA Desktop]$ exec 5< test1 # 指定数字分配文件描述符
[zhangchen@EDA Desktop]$ ls -al /proc/34005/fd
total 0
dr-x------. 2 zhangchen zhangchen 0 Sep 24 14:08 .
dr-xr-xr-x. 9 zhangchen zhangchen 0 Sep 24 14:08 ..
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 0 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 1 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 2 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:09 255 -> /dev/pts/0
l-wx------. 1 zhangchen zhangchen 64 Sep 24 14:08 5 -> /home/zhangchen/Desktop/test1
[zhangchen@EDA Desktop]$ exec {fd}< test2 # 自动分配文件描述符
[zhangchen@EDA Desktop]$ echo $fd
10
[zhangchen@EDA Desktop]$ ls -al /proc/34005/fd
total 0
dr-x------. 2 zhangchen zhangchen 0 Sep 24 14:08 .
dr-xr-xr-x. 9 zhangchen zhangchen 0 Sep 24 14:08 ..
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 0 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 1 -> /dev/pts/0
l-wx------. 1 zhangchen zhangchen 64 Sep 24 14:08 10 -> /home/zhangchen/Desktop/test2
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:08 2 -> /dev/pts/0
lrwx------. 1 zhangchen zhangchen 64 Sep 24 14:09 255 -> /dev/pts/0
l-wx------. 1 zhangchen zhangchen 64 Sep 24 14:08 5 -> /home/zhangchen/Desktop/test1
例2展示了输入重定向过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例2
# 文件:redirection.sh
exec 5< test1
exec {fd}< test2[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
open("test1", O_RDONLY) = 3
fcntl(5, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 5) = 5
close(3) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("test2", O_RDONLY) = 3
fcntl(3, F_DUPFD, 10) = 10
close(3)
*****
可以看出,在系统调用open打开文件test1和test2时,返回的文件描述符都是其实3,但是系统调用dup2(3, 5)和fcntl(3, F_DUPFD, 10)将其复制为了文件描述符5和10。系统调用open的参数O_RDONLY表示以只读模式打开。
如果在交互式bash中,将标准输入重定向为了其他文件,则终端会直接退出,如例3所示。
# 例3
[zhangchen@EDA Desktop]$ exec 0< test # 终端会直接退出
[zhangchen@EDA Desktop]$ exec 0< test; sleep 5 # 终端会在等待5秒后退出
下面的命令可以关闭已打开的文件描述符,如例4所示。
exec [number|varname]<& -
exec [number|varname]>& -
# 两种命令效果是一样的,并不区分输入还是输出
# 它们唯一的区别在于,不指定number或varname时
# <&-默认指的是关闭标准输入描述符,即0<&-;>&-默认指的是关闭标准输出描述符,即1>&-
# [number|varname]和<、>和&之间不能有空格,和-间可以有
# 例4
[zhangchen@EDA Desktop]$ exec 5<& - # 关闭文件描述符5
[zhangchen@EDA Desktop]$ exec {fd}>& - # fd的值为10,因此关闭文件描述符10
输出重定向
exec [number|varname]>[|] filename
# 如果不使用exec,则无法影响当前Bash进程
# [number|varname]和>h和[|]之间不能有空格
输出重定向会首先将文件名进行拓展(如参数扩展和命令替换),如果使用number,会在文件描述符number上以写模式打开该文件,如果文件不存在则会创建它;如果使用varname,则会自动分配一个大于等于10的文件描述符并将其数字赋值给变量varname;如果未指定number或varname,则默认为标准输出(文件描述符1)。
如果重定向操作符是>,并且启用了noclobber选项(通过命令set -o noclobber启用),则如果目标文件已经存在且是常规文件,则重定向会失败。
如果重定向操作符是>|,或者使用>但未启用noclobber选项,则如果目标文件已经存在,会将其截断为零字节。
例5展示了输出重定向过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例5
# 文件:redirection.sh
set -o noclobber
exec 5> test1 # 重定向失败
exec {fd}>| test2[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
write(2, "redirection.sh: line 2: test1: c"..., 62redirection.sh: line 2: test1: cannot overwrite existing file
) = 62
open("test2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(3, F_DUPFD, 10) = 10
close(3)
*****
系统调用open的参数O_WDONLY表示以只写模式打开,参数O_CREAT表示如果文件不存在,则创建它,参数O_TRUNC表示如果文件已存在,则将其内容截断为零字节。
例6展示了输出重定向后,后续命令的输出都不出现在终端。
# 例6
[zhangchen@EDA Desktop]$ exec > test1 # 标准输出(文件描述符1)重定向到文件test1
[zhangchen@EDA Desktop]$ echo 123456789 # 向标准输出(文件描述符1)输出文本
[zhangchen@EDA Desktop]$ exec >&- # 关闭标准输出(文件描述符1)
[zhangchen@EDA Desktop]$ cat test1 # 向标准输出(文件描述符1)输出文本
cat: standard output: Bad file descriptor # 标准输出(文件描述符1)已被关闭
[zhangchen@EDA Desktop]$ exec > /dev/pts/0 # 重新让标准输出(文件描述符1)指向终端
[zhangchen@EDA Desktop]$ cat test1 # 向标准输出(文件描述符1)输出文本
123456789 # 成功输出文本
例6中还存在一个插曲,当将标准输出重定向到test1并写入文本12345678后,使用exec >&-关闭文件描述符,此时如果尝试使用cat输出test1文件的内容会报错,这是因为此时标准输出,即文件描述符0并未指向有效的终端,因此需要将标准输出重定向回终端,此时才能正常显示。
输出追加重定向
exec [number|varname]>> filename
# 如果不使用exec,则无法影响当前Bash进程
# [number|varname]和>>之间不能有空格
与输出重定向类似,不同的是,如果文件已经存在,则新的输出将附加到文件末尾,而不会清空原有内容。
例7展示了输出追加重定向过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例7
# 文件:redirection.sh
exec 5>> test1[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
open("test1", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
fcntl(5, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 5) = 5
close(3) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
*****
系统调用open的参数O_WDONLY表示以只写模式打开,参数O_CREAT表示如果文件不存在,则创建它,参数O_APPEND表示在写入数据时,所有数据都会追加到文件的末尾,而不是从文件开头开始写入。
例8展示了输出追加重定向后,输出的内容是追加到文件末尾的。
# 例8
[zhangchen@EDA Desktop]$ cat test1
123456789
[zhangchen@EDA Desktop]$ exec >> test1 # 标准输出(文件描述符1)重定向到文件test1
[zhangchen@EDA Desktop]$ echo 123456789 # 向标准输出(文件描述符1)输出文本
[zhangchen@EDA Desktop]$ exec >&- # 关闭标准输出(文件描述符1)
[zhangchen@EDA Desktop]$ exec > /dev/pts/0 # 重新让标准输出(文件描述符1)指向终端
[zhangchen@EDA Desktop]$ cat test1 # 向标准输出(文件描述符1)输出文本
123456789 # 追加输出
123456789
标准输出和标准错误重定向
exec &> filename # 更好的格式
exec >& filename
# 如果不使用exec,则无法影响当前Bash进程
# &和>之间不能有空格
标准输出和标准错误重定向会首先将文件名进行拓展(如参数扩展和命令替换),然后将标准输出(文件描述符1)和标准错误输出(文件描述符2)都重定向到同一个文件。
需要注意的是,使用>&时文件不能扩展为number或-,如果是,则会被当作是复制文件描述符(见后),这是为了兼容性考虑。
例9展示了标准输出和标准错误重定向过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例9
# 文件:redirection.sh
exec &> test1[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
open("test1", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
dup2(1, 2) = 2
*****
在系统调用open打开文件test1时,返回的文件描述符是3,而dup2(3, 1)将其复制为了文件描述符1,进一步dup2(1, 2)将文件描述符1复制为了文件描述符2,此时文件描述符1和2都指向test1文件。
例10展示了标准输出和标准错误重定向后,后续命令的输出不出现在终端。
# 例10
# 文件:redirection.sh
exec &> test1
echo "This is standard output" # 标准输出
ls non_existent_file # 这将导致错误,产生标准错误
echo "This will also be standard output" # 另一个标准输出[zhangchen@EDA Desktop]$ bash redirection.sh
[zhangchen@EDA Desktop]$ cat test
This is standard output
ls: cannot access non_existent_file: No such file or directory
This will also be standard output
标准输出和标准错误追加重定向
exec &>> filename
# 如果不使用exec,则无法影响当前Bash进程
# &和>>之间不能有空格
与标准输出和标准错误重定向类似,不同的是,如果文件已经存在,则新的输出将附加到文件末尾,而不会清空原有内容。
例11展示了标准输出和标准错误追加重定向过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例11
# 文件:redirection.sh
exec &>> test1[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
open("test1", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
dup2(1, 2) = 2
*****
在系统调用open打开文件test1时,返回的文件描述符是3,而dup2(3, 1)将其复制为了文件描述符1,进一步dup2(1, 2)将文件描述符1复制为了文件描述符2,此时文件描述符1和2都指向test1文件。
例12展示了标准输出和标准错误追加重定向后,输出的内容是追加到文件末尾的。
# 例12
# 文件:redirection.sh
exec &> test1
echo "This is standard output" # 标准输出
ls non_existent_file # 这将导致错误,产生标准错误
echo "This will also be standard output" # 另一个标准输出[zhangchen@EDA Desktop]$ cat test
12345678
[zhangchen@EDA Desktop]$ bash redirection.sh
[zhangchen@EDA Desktop]$ cat test
12345678
This is standard output
ls: cannot access non_existent_file: No such file or directory
This will also be standard output
复制文件标识符
exec [number|varname]<& filename
exec [number|varname]>& filename
# 两种命令效果是一样的,并不区分输入还是输出,,但建议与被复制(关闭)的文件描述符方向一致
# 它们唯一的区别在于,不指定number或varname时
# <& filename默认指的是被复制(关闭)的标准输入描述符,即0<& filename;>& filename默认指的是被复制(关闭)的标准输出描述符,即1>& filename
# [number|varname]和<、>和&之间不能有空格
- 如果filename展开为数字,则其表示要被复制的文件描述符,那么文件描述符number(指定)或varname(自动分配)将成为该文件描述符的副本,即指向同一个文件。
- 如果filename展开为-,则其表示要关闭文件描述符。
- 如果filename展开文件名,则其表示标准输出和标准错误重定向。
- 其他情况下,会出现错误。
例13展示了复制文件标识符过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例13
# 文件:redirection.sh
exec 3> test1
exec 4>& 3[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
open("test1", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fcntl(4, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 4) = 4
*****
在系统调用open打开文件test1时,返回的文件描述符是3,此时不再需要系统调用dup2调整了,因为这就是我们指定的数字,而dup2(3, 4)将其复制为了文件描述符4,此时文件描述符3和4都指向test1文件。
移动文件描述符
exec [number|varname]<& number-
exec [number|varname]>& number-
# 两种命令效果是一样的,并不区分输入还是输出,但建议与被移动的文件描述符方向一致
# 它们唯一的区别在于,不指定number或varname时
# <& number-默认指的是移动到标准输入描述符,即0<& number-;>& number-默认指的是标准输出描述符,即1>& number-
# [number|varname]和<、>和&之间不能有空格,number和-之间不能有空格,&与和number之间可以有空格
该命令将文件描述符number复制为文件描述符number(指定)或varname(自动分配),并在此后关闭文件描述符number。
例14展示了移动文件描述符过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例14
# 文件:redirection.sh
exec 3> test1
exec 4>& 3-[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
open("test1", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fcntl(4, F_GETFD) = -1 EBADF (Bad file descriptor)
fcntl(4, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 4) = 4
fcntl(3, F_GETFD) = 0
close(3) = 0
*****
可以看到,在系统调用dup2将文件描述符3赋值为了文件描述符4后,紧接着就是用系统调用close关闭了文件描述符3。
输入和输出重定向
exec [number|varname]<> filename
# 如果不使用exec,则无法影响当前Bash进程
# [number|varname]和<和>之间不能有空格
以读写方式打开一个文件,是用文件描述符number(指定)或varname(自动分配),如果未指定number或varname,则默认为标准输入(文件描述符0)。
例15展示了移动文件描述符过程中的系统调用,由于strace无法直接在交互式bash中追踪内建命令exec,我们选择编写一个测试脚本。
# 例15
# 文件:redirection.sh
exec 3<> test1[zhangchen@EDA Desktop]$ strace bash redirection.sh
*****
open("test1", O_RDWR|O_CREAT, 0666) = 3
*****
系统调用open的参数O_RDWR表示以读写模式打开,参数O_CREAT表示如果文件不存在,则创建它。
叠加使用
上面的八种重定向命令,可以多个混合使用,此时从左往右依次执行,如下所示。
exec &> filename 等价于 exec > filename 2>& 1或exec > filename 2<& 1(不建议)
exec &>> filename 等价于 exec > filename 2>>& 1或exec > filename 2<<& 1(不建议)
命令重定向
全局重定向的影响范围很广,所有后续的命令都会受到影响(因为文件描述符继承),但命令重定向只针对一条命令而言,重定向只发生在子进程中,其他都是相同的。
下面给了一个例子,将echo命令的标准输出(文件描述符1)重定向至文件test1。
[zhangchen@EDA Desktop]$ echo test_message > test1
[zhangchen@EDA Desktop]$ cat test1
test_message
下面展示了命令重定向过程中的系统调用情况。
# 文件:redirection.sh
ls > test1
echo 111111111111111111111
[zhangchen@EDA Desktop]$ strace -f bash redirection.sh # -f选项很重要,加上它才能追踪子进程的系统调用
*****
[pid 71192] open("test1", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 71192] dup2(3, 1) = 1
[pid 71192] close(3) = 0
[pid 71192] execve("/usr/bin/ls", ["ls"], 0x12f4bb0 /* 66 vars */) = 0
*****
write(1, "111111111111111111111\n", 22111111111111111111111 # 后面一串是命令的输出
) = 22
*****
可以看到,系统调用open是在子进程[pid 71192]中进行的,echo的输出使用原本的标准输出(文件描述符1),即还是原来的终端,所以在后面看到了命令的输出。
细心的人可能会发现,echo命令并没有创建子进程,虽然echo命令不是内建命令,但它是直接在原bash进程中执行的,如果重定向它的标准输入输出,岂不是会影响全局?其实不会,下面举例说明。
# 文件:redirection.sh
echo 111111111111111111111 > test1
echo 222222222222222222222[zhangchen@EDA Desktop]$ strace -f bash redirection.sh # -f选项很重要,加上它才能追踪子进程的系统调用
open("test1", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
close(3) = 0
fstat(1, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6e4f095000
write(1, "111111111111111111111\n", 22) = 22
dup2(10, 1) = 1
fcntl(10, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(10) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
write(1, "222222222222222222222\n", 22222222222222222222222
) = 22
*****
原来在使用dup2函数将标准输出(文件描述符1)指向test1前,先使用了fcntl(1, F_DUPFD, 10)将文件描述符1原本指向的终端保存了下来,第一个echo执行后,又使用了dup2(10, 1) 将其还原!
相关文章:

Linux:八种重定向详解(万字长文警告)
相关阅读Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 本文将讨论Linux中的重定向相关问题,在阅读本文前,强烈建议先学习文件描述符的相关内容Linux:文件描述符详解。 重定向分为两类&#x…...

set和map系列容器
前言 学习完二叉搜索树本来是应该直接深化,讲平衡二叉搜索树的。但是在学习它的底层逻辑之前呢,我们先来学学它的应用场面。 set和map的底层不是平衡二叉搜索树而是红黑树,实际上的难度比平衡搜索二叉树大。所以它的底层逻辑会比平衡二叉树更…...

企业告警智策助手 | OPENAIGC开发者大赛企业组AI创作力奖
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...

函数组件、Hooks和类组件区别
1. 函数组件(Function Components) 函数组件是接收props并返回React元素的纯JavaScript函数。它们不能拥有自己的状态(state)或生命周期方法,但在React 16.8中引入Hooks之后,这种情况发生了变化。 特点&a…...

在线点餐新体验:Spring Boot 点餐系统
摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于网上点餐系统当然也不能排除在外,随着网络技术的不断成熟,带动了网上点餐系统,它彻底改变了过去传统的…...

WPF中Viewbox的介绍和用法
在 WPF(Windows Presentation Foundation) 中,Viewbox 是一个非常有用的容器控件,主要用于根据其自身大小自动调整子元素的缩放比例,以保持其内容的显示效果。无论窗口如何调整大小,Viewbox 内的内容都会按…...

QMT如何获取股票基本信息?如上市时间、退市时间、代码、名称、是否是ST等。QMT量化软件支持!
获取股票概况 包含股票的上市时间、退市时间、代码、名称、是否是ST等。 #获取合约基础信息数据 该信息每交易日9点更新 #内置Python 提示 旧版本客户端中,函数名为ContextInfo.get_instrumentdetail 调用方法 内置python ContextInfo.get_instrument_detai…...

2024年中国科技核心期刊目录(科普卷)
2024年中国科技核心期刊目录 (科普卷) 序号 期刊名称 1 爱上机器人 2 百科知识 3 保健医…...

[解决]navicat连接mysql成功,但是使用jdbc连接不上
在连接数据库时,最初使用的 JDBC URL 配置如下: jdbc:mysql://192.168.56.100:3306/mzxLiving_manage?useUnicodetrue&characterEncodingUTF-8&serverTimezoneAsia/Shanghai修改之后的JDBC URL为 jdbc:mysql://192.168.56.100:3306/mzxLiving…...

sar信号RD域的距离向傅里叶变换
下面可知,举例傅里叶变换时,posp 距离时间和频率 t不等于ft/K。而方位时间和频率时这种线性关系...

4 html5 web components原生组件详细教程
web components 前面我们已经介绍过,这一期我们就来讲一讲具体用法和这其中的关键只是点: 1 基本使用 如果我们想实现一个封装的原生组件,那就离不开使用js去封装,这里主要就是基于HTMLElement这个类,去创建创建一个…...

nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)
文章目录 简介配置过程前置环境请看创建健康检查脚本结果测试 简介 在我们通过nginxkeepalived实现高可用后,会发现nginx出现故障的时候keepalived并不会将虚拟ip切换到备份服务器上其原理就是nginx和keepalived是两个独立的服务,Nginx的故障状态不会触…...

什么是AI大模型?
什么是AI大模型? 人工智能(AI)大模型近年来在各个领域掀起了一场技术革命,从语言生成到图像识别,再到自动驾驶和医疗诊断,AI大模型的应用场景越来越广泛。这些模型的表现令人惊叹,但它们的工作原理和背后技…...

建造者模式__c#
目录 调用 指挥者 抽象建造者 建造者 定义具体产品 调用 用指挥者指挥建造者建造产品 在指挥者这里组装成产品 namespace _建造者模式 {internal class Program{static void Main(string[] args){Builder buildernew JiangHuaiBuilder();//建造者Director director new…...

学习MRI处理过程中搜到的宝藏网站
今天浏览网页查到了一些宝藏网站,正好记录一下,后面搜到好东东再接着填充,方便查阅~ (1)牛人网站 这个网站是在搜集seed关键词时发现的,用pdf文档记录,可下载查阅,条理清晰…...

【C语言】const char*强制类型转换 (type cast)的告警问题
void run_upload(const char *ftp_url) {CircularQueue queue;// 初始化环形队列for (int i = 0; i < QUEUE_SIZE; i++) {queue.items[i].data = malloc(BUFFER_SIZE);if (queue.items[i].data == NULL) {fprintf(stderr, "Failed to allocate memory for queue item %…...

python-比较月亮大小/数组下标/人见人爱a+b
一:比较月亮大小 题目描述 小理是一名出色的狼人。众所周知,狼人只有在满月之夜才会变成狼。 同时,月亮的大小随着时间变化,它的大小变化 3030 天为一循环。 它的变化情况(从第一天开始)为 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,1…...

什么是组态、组态的应用场景介绍
随着计算机技术和工业自动化水平迅速提高,而车间现场种类繁杂的控制设备和过程监控装置使得传统的工业控制软件无法满足用户的各种需求。在“组态”概念出现之前,工程技术人员需要通过编写程序来实现某一任务,不但工作量大、周期长࿰…...

Java项目: 基于SpringBoot+mybatis+maven实现的智能推荐卫生健康系统分前后台(含源码+数据库+开题报告+任务书+毕业论文)
一、项目简介 本项目是一套基于SpringBootmybatismaven实现的智能推荐卫生健康系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美…...

本地生活商城开发搭建 同城O2O线上线下推广
同城本地化商城目前如火如荼,不少朋友咨询本地生活同城平台怎么开发,今天商淘云与大家分享同城O2O线上商城的设计和开发。 本地生活商城一般会涉及到区域以及频道类,一般下单需要支持用户定位、商家定位,这样利于用户可以快速找到…...

41. 如何在MyBatis-Plus中实现批量操作?批量插入和更新的最佳实践是什么?
在 MyBatis-Plus 中,实现批量操作(如批量插入、批量更新)是非常常见的需求。MyBatis-Plus 提供了对批量操作的良好支持,可以通过多种方式实现高效的批量处理。下面详细介绍批量操作的实现方式以及最佳实践。 1. 批量插入 批量插入…...

LlamaIndex 的Node节点后处理器模块介绍
Node 后处理器模块 LlamaIndex 是一个旨在连接大型语言模型(LLMs)与外部数据的框架,允许开发者构建能够处理和回应复杂查询的应用程序。在这个框架内,NodePostProcessor 扮演着优化数据处理流程的重要角色。为了更好地理解 NodeP…...

Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解
Dubbo 是一个高性能的 Java 分布式服务框架,而 Zookeeper 常被用作 Dubbo 的服务注册中心。Zookeeper 提供了分布式一致性和协调服务,Dubbo 通过 Zookeeper 实现服务注册与发现功能,确保在分布式环境下服务实例的动态管理和可靠发现。 下面是…...

Linux:进程间通信之命名管道
Linux:进程间通信-CSDN博客 我们说匿名管道只能用于父子进程这样的关系通信,那么陌生进程怎么通信? 我们之前说父子进程能通信的最关键的地方就在于子进程复制了一份父进程的files_struct,从而通过文件的inode映射同一份文件来通…...

UE4_后期处理七—仿红外线成像效果
效果图展示: 参考文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-fresnel-in-your-unreal-engine-materials?application_version5.4 二、所用知识点扩充 在创建电影或过场动画时,你常常需要想办法更好地突显角…...

静态路由和默认路由(实验)
目录 一、实验设备和环境 1、实验设备 2、实验环境 (1)实验拓扑图 (2)实验命令列表 二、实验记录 1、直连路由与路由表查看 步骤1:建立物理连接并运行超级终端。 步骤2:在路由器上查看路由表。 2、静态路由配置 步骤1:配…...

TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model
文章汇总 存在的问题 原文:具有图像特定知识的图像条件提示符号在提升类嵌入分布方面的能力较差。 个人理解:单纯把"a photo of {class}"这种提示模版作为输入是不利于text encoder学习的 动机 在可学习的提示和每一类的文本知识之间建立…...

2024年软考网络工程师中级题库
1【考生回忆版】以下不属于5G网络优点的是(A) A.传输过程中消耗的资源少,对设备的电池更友好 B.支持大规模物联网,能够连接大量低功耗设备,提供更高效的管理 C.引入了网络切片技术,允许将物理网络划分为多个虚拟网络…...

CSS的盒子模型(Box Model)
所有HTML元素都可以看作盒子,在CSS中盒子模型是用来设计和布局的,CSS盒子模型本质上是一个盒子,分装周围的HTML元素包括:外边距,边框,内边距和实际内容。 Margin(外边距) 清除边框…...

用OpenSSL搭建PKI证书体系
1 创建PKI结构目录 mkdir 07_PKI cd 07_PKI mkdir 01_RootCA 02_SubCA 03_Client2 创建根CA cd 01_RootCA mkdir key csr cert newcerts touch index.txt index.txt.attr echo 01 > serial2.1 创建根CA密钥对 2.1.1 生成 长度为2048 bit 的RSA私钥。 cd key openssl gen…...