小编Rob*_*nes的帖子

C单元测试框架:比较

我是一个红宝石程序员,我真的很想做TDD.现在,我在C中编程了一点,但我喜欢我的工具以及我用ruby编程的方式.所以,我正在寻找一个在C中进行单元测试的框架.你能告诉我什么?

我已经找到了一些选项,例如:cunit,cmockery,CuTest等.问题是,我不知道如何评估最好的一个.我正在为我的编译器大学课程编写一个简单的编译器.

你可以帮帮我吗?

c tdd

9
推荐指数
2
解决办法
4240
查看次数

Linux内核中有哪些数据结构可用

是否存在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)

linux-kernel data-structures

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

Legit使用C/C++中的offsetof offset

有这个宏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)

这个宏有什么其他合法用途?你什么时候应该不会使用这个宏?

编辑到目前为止,对于一个不同的SO问题的答案是迄今为止我见过的最好的答案.

c c++ macros

8
推荐指数
3
解决办法
3309
查看次数

设置复杂CTAGS搜索路径的提示

我希望能够在我的项目中的任意子目录中启动vim,并让它搜索tags文件的项目根目录,然后搜索项目树外部的不相关目录.

例如,假设我有以下内容:

~/projects/foo/bar/baz.c
~/projects/foo/tags
~/some/arbitrary/path/tags
Run Code Online (Sandbox Code Playgroud)

我想baz.cbar子目录中打开,让它搜索到找到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上买路.

linux vim ctags

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

具有多宿主功能的SCTP替代TCP

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以利用多宿主的时候注意任何问题吗?

sockets network-programming tcp network-protocols sctp

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

我该怎么做才能避免接收端的TCP Zero Window/TCP Window Full?

我有一个小应用程序,它通过网络将文件发送到位于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)

c++ network-programming tcp cross-platform

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

c89:将int转换为void*并返回

首先,这不是一个骗局:

将int转换为void指针并再次返回int是否安全?

问题的不同之处在于:我只使用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 ...

c c89

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

%x格式说明符,在C中带有unsigned char

我遇到了以下示例程序,但我并不完全理解它的输出:

#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)

c

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

使用HTTP/1.1 Pipelining发出多个请求

使用HTTP/1.1 Pipelining时标准对发出多个请求的说法是什么,而不等待每个请求完成?服务器在实践中做了什么?

我问,因为我曾尝试编写一个客户端,它会发出一批GET多个文件的请求,并记得收到错误.我不确定是否是由于我错误地发出了GET或者需要等待每个请求完成才能发出下一个请求GET.

language-agnostic http network-protocols

7
推荐指数
1
解决办法
1218
查看次数

C++:NVI和模板方法模式之间的区别?

NVI(非虚拟接口)和模板方法模式之间有什么区别?

它们看起来非常相似,而且我已经读到它们基本相同,并且它们与模板在某种程度上更为通用有些微妙的不同.

c++ design-patterns non-virtual-interface template-method-pattern

7
推荐指数
2
解决办法
1856
查看次数