我是一个红宝石程序员,我真的很想做TDD.现在,我在C中编程了一点,但我喜欢我的工具以及我用ruby编程的方式.所以,我正在寻找一个在C中进行单元测试的框架.你能告诉我什么?
我已经找到了一些选项,例如:cunit,cmockery,CuTest等.问题是,我不知道如何评估最好的一个.我正在为我的编译器大学课程编写一个简单的编译器.
你可以帮帮我吗?
是否存在Linux内核中使用的所有主要通用数据结构的某个列表,以及它们被使用的主要奖励?
我所说的"通用数据结构"是指双链表,哈希表,计时器轮等.
另外,哪些被认为是模块内部提供的api的一部分?
编辑
在linux/lib目录中我看到一些有希望的线索......
bitmap.c
plist.c
prio_heap.c
prio_tree.c
radix-tree.c
rbtree.c
Run Code Online (Sandbox Code Playgroud) 有这个宏offsetof在C/C++,让您获得地址的POD结构成员的偏移.有关C FAQ的示例:
struct foo {
int a;
int b;
};
struct foo;
/* Set the b member of foo indirectly */
*(int *)((char *)foo + offsetof(b)) = 0xDEADBEEF;
Run Code Online (Sandbox Code Playgroud)
现在这对我来说似乎是邪恶的,我看不出这个宏的许多合法用途.
我看到的一个合法的例子是它在Linux内核中的container_of宏中用于获取嵌入式结构父对象的地址:
/* get the address of the cmos device struct in which the cdev
structure which inode points to is embedded */
struct cmos_dev *cmos_devp =
container_of(inode->i_cdev, struct cmos_dev, cdev);
Run Code Online (Sandbox Code Playgroud)
这个宏有什么其他合法用途?你什么时候应该不会使用这个宏?
我希望能够在我的项目中的任意子目录中启动vim,并让它搜索tags文件的项目根目录,然后搜索项目树外部的不相关目录.
例如,假设我有以下内容:
~/projects/foo/bar/baz.c
~/projects/foo/tags
~/some/arbitrary/path/tags
Run Code Online (Sandbox Code Playgroud)
我想baz.c从bar子目录中打开,让它搜索到找到foo/tags然后搜索some/arbitrary/path/tags是否找不到符号foo/tags.
现在我知道我能做到:
set tags=./tags,tags;
Run Code Online (Sandbox Code Playgroud)
完成第一项任务.它显然是分号,告诉vim搜索根.但是,以下两项工作都不是:
set tags=./tags,tags,~/some/arbitrary/path/tags;
set tags=./tags,tags;~/some/arbitrary/path/tags
Run Code Online (Sandbox Code Playgroud)
第一个只找到符号,~/some/arbitrary/path/tags而第二个只在项目根目录的tags文件中找到符号.
有人知道怎么做吗?我在Linux上买路.
SCTP具有本机多宿主支持,如果我理解正确,将在主接口关闭时通过辅助NIC自动重新路由您的数据包.我通过编写自定义路由守护程序来复制此功能,以便在主NIC发生故障时修改路由表.我想尝试使用SCTP.
在Steven的Unix网络编程V1第3版第288页中,它说:
对于此示例,我们使用一对多样式的服务器.我们做出这个选择有一个重要原因.可以修改第5章中的示例以通过
SCTP一个小的更改来运行:修改socket函数调用以指定IPPROTO_SCTP而不是IPPROTO_TCP作为第三个参数.但是,简单地进行此更改不会利用SCTP除多宿主之外提供的任何其他功能.
现在我尝试了相当差的结果.
我正在使用安装了libsctp1,libsctp-dev和lksctp-tools软件包的Ubuntu 9.04上运行.我已经使用SCTP正常工作的lksctp-tools进行了验证.
我拿了UNP示例代码并修改了如上所示~/unpv13e/tcpcliserv/tcpserv04.c和~/unpv13e/select/tcpcli02.c程序.
这是一个简单的echo服务器/客户端对.服务器运行显然正在侦听,但客户端退出说连接被拒绝.由于netstat不支持SCTP我使用的lsof -n | grep tcpserv显示我:
tcpserv04 6208 alice 3u sock 0,4 33889 can't identify protocol
Run Code Online (Sandbox Code Playgroud)
除了tcpserv04有某种套接字打开之外,这似乎并没有告诉我什么.
我已经重新编写并测试了perl中的原始TCP客户端,所以我将其切换到sctp并且能够连接虽然在stdin上管道文件没有完全正常工作(通过接收回声的回来挂了大约2/3) .
似乎UNP暗示将TCP应用程序移植到SCTP以利用多宿主是微不足道的,但基于这种简单的尝试似乎并非如此.
任何人都可以指点我一个好的教程,或者在将TCP应用程序移植到一对一风格的SCTP以利用多宿主的时候注意任何问题吗?
我有一个小应用程序,它通过网络将文件发送到位于Windows操作系统上的代理.
当此应用程序在Windows上运行时,一切正常,通信正常,文件全部复制成功.
但是,当这个应用程序在Linux上运行时(RedHat 5.3,接收器仍然是Windows) - 我在Wireshark中看到TCP Zero Window和TCP Window Full的网络跟踪消息每1-2秒出现一次.然后,代理会在几分钟后关闭连接.
Windows - Linux代码几乎相同,非常简单.唯一的非平凡操作是setsockopt,SO_SNDBUF和值0xFFFF.删除此代码没有帮助.
有人可以帮我解决这个问题吗?
编辑:添加发送代码 - 它看起来它正确处理部分写入:
int totalSent=0;
while(totalSent != dataLen)
{
int bytesSent
= ::send(_socket,(char *)(data+totalSent), dataLen-totalSent, 0);
if (bytesSent ==0) {
return totalSent;
}
else if(bytesSent == SOCKET_ERROR){
#ifdef __WIN32
int errcode = WSAGetLastError();
if( errcode==WSAEWOULDBLOCK ){
#else
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
#endif
}
else{
if( !totalSent ) {
totalSent = SOCKET_ERROR;
}
break;
}
}
else{
totalSent+=bytesSent;
}
}
} …Run Code Online (Sandbox Code Playgroud) 首先,这不是一个骗局:
问题的不同之处在于:我只使用void*来存储int,但我实际上从未将它用作void*.
所以这个问题真的归结为:
void*保证至少与int一样宽
我不能使用intptr_t,因为我使用的是c89/ANSI C.
编辑
在C99(gcc版本)的stdint.h中,我看到以下内容:
/* Types for `void *' pointers. */
#if __WORDSIZE == 64
# ifndef __intptr_t_defined
typedef long int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned long int uintptr_t;
#else
# ifndef __intptr_t_defined
typedef int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned int uintptr_t;
#endif
Run Code Online (Sandbox Code Playgroud)
我可能只是偷偷摸摸地装上类似的东西并期望它能起作用吗?似乎转换应该工作,因为所有intptr_t都是整数类型的typedef ...
我遇到了以下示例程序,但我并不完全理解它的输出:
#include <stdio.h>
int main( void ) {
unsigned char i, m =0xFF, n=0x1;
for ( i = 0; i != 8; i++,n+=n, m/=2 )
printf("%5x %5x %5x %5x %5x %5x\n", n,m,n&m,n|m,n^m,~n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印出来:
1 ff 1 ff fe fffffffe
2 7f 2 7f 7d fffffffd
4 3f 4 3f 3b fffffffb
8 1f 8 1f 17 fffffff7
10 f 0 1f 1f ffffffef
20 7 0 27 27 ffffffdf
40 3 0 43 43 ffffffbf
80 1 …Run Code Online (Sandbox Code Playgroud) 使用HTTP/1.1 Pipelining时标准对发出多个请求的说法是什么,而不等待每个请求完成?服务器在实践中做了什么?
我问,因为我曾尝试编写一个客户端,它会发出一批GET多个文件的请求,并记得收到错误.我不确定是否是由于我错误地发出了GET或者需要等待每个请求完成才能发出下一个请求GET.