任何使用位域的可移植代码似乎都区分了小端和大端平台.有关此类代码的示例,请参阅linux内核中struct iphdr的声明.我无法理解为什么位字节序是一个问题.
据我所知,bitfields纯粹是编译器构造,用于促进位级操作.
例如,考虑以下位域:
只是一种简洁易懂的说法
struct ParsedInt {
unsigned int f1:1;
unsigned int f2:3;
unsigned int f3:4;
};
uint8_t i;
struct ParsedInt *d = &i;
d->f2
.
但是,无论架构如何,位操作都是明确定义的并且可以正常工作.那么,bitfields怎么不便携?
我想做的是跟随.在函数内部,我需要为变量赋值,该变量的名称取自另一个变量.换一种说法:
func() {
#
# Here happens something that ultimately makes $arg="var_name"
#
declare -g ${arg}=5
}
func
echo ${var_name}; # Prints out "5"
Run Code Online (Sandbox Code Playgroud)
上面的代码片段在bash 4.2中运行良好.但是,在4.2之前的bash中,declare
没有-g
选项.我在google上发现的一切都说要在函数中定义全局变量,我应该只使用var=value
语法,但不幸的是,var
它本身依赖于另一个变量.${arg}=5
也行不通.(它说-bash: var_name=5: command not found
.
对于好奇,所有这一切的原因是这个函数实际上从脚本参数创建全局变量,即运行script --arg1=val
自动创建名为arg1
value的变量val
.节省了大量的样板代码.
我有一个生成大 SCSI 写入的用户空间应用程序(详细信息如下)。然而,当我查看到达 SCSI 目标(即存储,由 FC 连接)的 SCSI 命令时,某些东西将这些写入拆分为 512K 块。
该应用程序基本上会直接向设备进行 1M 大小的直接写入:
fd = open("/dev/sdab", ..|O_DIRECT);
write(fd, ..., 1024 * 1024);
Run Code Online (Sandbox Code Playgroud)
此代码导致发送两个 SCSI WRITE,每个 512K。
但是,如果我发出直接 SCSI 命令,而没有块层,则不会拆分写入。我从命令行发出以下命令:
sg_dd bs=1M count=1 blk_sgio=1 if=/dev/urandom of=/dev/sdab oflag=direct
Run Code Online (Sandbox Code Playgroud)
我可以看到一个 1M 大小的 SCSI WRITE。
问题是,什么是拆分写入,更重要的是,它是否可配置?Linux 块层似乎是有罪的(因为 SG_IO 不通过它)并且 512K 似乎太随意了,不能成为某种可配置的参数。
bash ×1
bit-fields ×1
block ×1
c ×1
kernel ×1
linux ×1
linux-kernel ×1
low-level ×1
portability ×1
scope ×1
scsi ×1
shell ×1