小编woo*_*tok的帖子

linux/list.h中container_of宏背后的原理

在linux内核列表的实现中/include/linux/list.h,container_of宏的第一行(下面粘贴)背后的基本原理是什么?

const typeof( ((type *)0)->member ) *__mptr = (ptr);
Run Code Online (Sandbox Code Playgroud)

在我的示例代码中,我删除了这一行并将定义更改为

#define container_of(ptr, type, member) ({                      \
     (type *)( (char *)ptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)

我的代码仍显示预期的结果.那么第一行是多余的吗?或者它有一些我不知道的隐藏陷阱?

我在Faq/LinkedLists找到的代码

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:        the pointer to the member.
 * @type:       the type of the container struct this is embedded in.
 * @member:     the name of the member within the struct.
 *
 */
#define container_of(ptr, type, …
Run Code Online (Sandbox Code Playgroud)

c struct pointers linked-list linux-kernel

31
推荐指数
1
解决办法
4724
查看次数

$$ @和Makefile中的管道符号代表什么?

在以下Makefile定义中:

  1. 什么是$$@在倒数第二行代表什么?
  2. |中间的符号怎么样?
define KERNEL_RULE
$(DESTDIR)/$(1) : kernel_modules
$(DEST_DIR)/$(1) : $(DESTDIR)/$(1) | $(DEST_DIR)
    cp $(DESTDIR)/$(1) $$@
endef
Run Code Online (Sandbox Code Playgroud)

makefile

30
推荐指数
1
解决办法
1万
查看次数

在vim中映射功能键

我想F2用以下条目映射我的nerdtree:

map <F2> :NERDTreeToggle<CR>
Run Code Online (Sandbox Code Playgroud)

但即使在此之前,并且在保存vimrc之后,每当我按下时F2,它只会切换光标所在字母的大小写.后来发现任何功能键都能做到.F5切换5个字符的大小写等.这是因为其他一些插件吗?我目前使用c.vim,snippetsEmu,surround,nerdtree和minibufexpl

我的vimrc中的任何功能键都没有键映射.

vim keymapping

19
推荐指数
2
解决办法
2万
查看次数

RSpec Ruby中关键字"应该"究竟是什么?

我是Ruby的初学者,有这个问题唠叨了我很久.

在RSpec文件中,如果我们写Book.should <do something>,should关键字是什么?它是Book对象的成员吗?它是如何成为Book对象的成员的?或者它是Ruby的一些构造?这是一个功能吗?如果它是函数或成员,我在哪里可以找到它的定义?

ruby rspec

10
推荐指数
1
解决办法
4638
查看次数

模拟linux中网络接口上的传入数据包

如果您通常通过一个名为eth0的接口发送pcap的tcpreplay,则数据包是出站的,即将通过网卡发送.有什么方法可以让pcaps入站,以便我的系统应该将其作为入站数据包处理?

可能的情景

我有一个从eth0接收数据包的应用程序,从数据包中提取一些细节并通过eth1发送.现在情况很好,如果网络设置和真正的数据包实际流入我的系统.但是出于测试目的,我没有什么连接到我的eth0或eth1的端口,但我还是想创建一个PCAP(可能通过一个脚本)类似类型的流量,使我不必依靠外部物理网络连接上用于测试应用程序.

linux networking network-programming

10
推荐指数
2
解决办法
5399
查看次数

在Unix内核中找到的C中的匿名结构

我已经开始在Unix v6上阅读狮子会评论.我偶然发现了这些片段,这些片段在C语言中从未见过.作者确实提供了某种解释,但有人可以向我解释这里发生了什么吗?

params.h :

SW 0177570
...... 
struct { int integ; };
Run Code Online (Sandbox Code Playgroud)

这用于 unix/prf.c

if(SW->integ == 0)
Run Code Online (Sandbox Code Playgroud)

作者的解释

SW之前定义为值0177570.这是只读处理器寄存器的内核地址,用于存储控制台交换机寄存器的设置.声明的含义很明确:获取位置0177570的内容并查看它们是否为零.问题是用C表达.代码if (SW == 0)不会传达这个含义.显然 SW是一个应该被解除引用的指针值.编译器可能已被更改为接受, if (SW-> == 0) 但就目前而言,这在语法上是不正确的.通过发明具有元素的虚拟结构,integ程序员已经找到了解决他的问题的令人满意的解决方案.

我的问题主要是这是如何工作的?当编译器看到时SW->integ,它如何SW与匿名结构相关联?

c unix structure

9
推荐指数
1
解决办法
589
查看次数

期望脚本自动telnet登录

我一直在尝试创建一个期望脚本,通过telnet自动登录我的设备

如果expect命令没有多种可能性,则脚本工作正常,登录到设备.

#!/usr/bin/expect
set timeout 20
set ip [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]

spawn telnet $ip $port
expect "'^]'." sleep .1;
send "\r";
sleep .1;
expect   "login:"
send "$user\r"
expect "Password:"
send "$password\r";
interact
Run Code Online (Sandbox Code Playgroud)

上面的脚本工作正常,并在我传递正确的参数时成功登录.但是,一旦我向expect命令添加了额外的分支(用于错误处理),脚本就会在提示符下卡住.login:一段时间后它会打印脚本错误 任何帮助?下面的错误脚本.

#!/usr/bin/expect
set timeout 20
set ip [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]

spawn telnet $ip $port …
Run Code Online (Sandbox Code Playgroud)

telnet expect

8
推荐指数
1
解决办法
4万
查看次数

获取不等待期望脚本中的用户输入

当我尝试运行以下期望脚本时,它只是完成运行而不是等待用户输入.有人能告诉我我做错了什么吗?

#!/usr/bin/expect
puts -nonewline stdout "Enter device id:"
flush stdout
gets stdin id
puts -nonewline  stdout "Enter device name:"
flush stdout
gets stdin name
Run Code Online (Sandbox Code Playgroud)

user-input tcl expect

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

vector&lt;int&gt; 上的 memset

根据Mark Ransoms关于使用 memset 的回答,我在 a 上使用 memsetvector<int>为所有元素分配值。

memset(&match_begin[0], 0xff , sizeof(match_begin[0]) * match_begin.size());
Run Code Online (Sandbox Code Playgroud)

它确实有显着的性能改进,std::fill并且运行良好(g++ 4.3.2,64 位 linux)。这段代码是否安全,如中所示,std::vector 实现是否总是保证数据的内存分配是连续的?在 stl 库的未来(或不同)实现中,这是否有可能在以后更改并破坏我的代码?

c++ stl vector memset

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

格鲁什科夫 NFA 是什么。格鲁什科夫 NFA 和汤普森 NFA 有什么区别?

我在http://lambda-the-ultimate.org/node/2064看到了这个术语“Glushkov NFA”。搜索引擎返回对使用 glushkov nfa 的文章的引用,但没有关于 glushkov nfa 本身的具体信息。

什么是格卢什科夫 NFA?它与 Thompson Construction 创建的 NFA 有什么不同?

automata nfa computation-theory

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