小编Leo*_*d99的帖子

为什么bit endianness是bitfields中的一个问题?

任何使用位域的可移植代码似乎都区分了小端和大端平台.有关此类代码的示例,请参阅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怎么不便携?

c portability cross-platform low-level bit-fields

54
推荐指数
4
解决办法
3万
查看次数

在函数内声明全局变量

我想做的是跟随.在函数内部,我需要为变量赋值,该变量的名称取自另一个变量.换一种说法:

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自动创建名为arg1value的变量val.节省了大量的样板代码.

bash shell scope

21
推荐指数
5
解决办法
3万
查看次数

Linux:写入分为 512K 块

我有一个生成大 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 似乎太随意了,不能成为某种可配置的参数。

linux kernel scsi block linux-kernel

5
推荐指数
1
解决办法
2202
查看次数