标签: c

如何在使用GCC编译的C文件中指定输出节?

在汇编语言中,我使用.section指令告诉汇编器输出到哪个部分,例如

.section init
Run Code Online (Sandbox Code Playgroud)

有没有办法在C文件中做同样的事情.我希望某些文件的代码进入不同的部分,以便我可以将其加载到不同的内存地址.我知道我可以为ld创建一个脚本并在那里指定部分,但我不想这样做.是否有一些编译器开关或.section指令类型的C文件将执行此操作?

c gcc ld

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

_Exit如何在C++程序中运行?

C99提供了_Exit功能,"立即"退出,但它确实可以关闭文件描述符.Unix/POSIX通过强制关闭所有fd而不刷新(并提供同义词_exit)来扩展此行为.

static当从C++程序调用时,这些函数是否会调用对象的析构函数?C++标准是否有任何保证_Exit

(受这个问题的启发;我突然想知道典型的情况会发生什么fork- exec- _exitC++中的习语.)

c c++ unix destructor exit

12
推荐指数
2
解决办法
2705
查看次数

如何使用mmap在堆中分配内存?

只是问题陈述,我如何使用mmap()在堆中分配内存?这是我唯一的选择,因为malloc()它不是可重入的函数.

c heap memory-management mmap

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

SCTP多宿主

我一直在使用C开发这个简单的客户端 - 服务器应用程序,其中客户端只是将随机数据发送到服务器,服务器只是监听客户端发送的内容.我正在使用的协议是SCTP,我对如何实现多宿主功能很感兴趣.

我一直在互联网上搜索有关SCTP和多宿主的信息,并且无法找到有关如何指示SCTP使用多个地址进行通信的任何示例.我只是设法找到在尝试使用多宿主设置SCTP时应该使用的命令,它应该非常简单.

我创建了一个客户端和一个服务器,它们都使用我的计算机两个WLAN接口作为它们的连接点.两个适配器都连接到同一个AP.服务器正在从这些接口侦听来自客户端的数据,客户端通过它们发送数据.问题是,当我断开客户端正在发送数据的主WLAN适配器时,传输只会在它应该回退到辅助连接时停止.我用Wireshark跟踪了数据包,第一个INIT和INIT_ACK数据包报告客户端和服务器都使用WLAN适配器作为通信链路.

当我重新连接主WLAN连接时,传输会在一段时间后继续传输并向服务器发送大量数据包,这是不对的.数据包应该通过辅助连接传输.在许多网站上,据说SCTP在连接之间自动切换,但在我的情况下,没有发生.所以你们有什么线索,为什么当主链路断开时传输不会回退到辅助连接,即使客户端和服务器知道其他地址包括辅助地址?

关于服务器:

服务器创建SOCK_SEQPACKET类型套接字并绑定使用INADDR_ANY找到的所有接口.getladdrs报告服务器被限制为3个地址(包括127.0.0.1).之后,服务器侦听套接字并等待客户端发送数据.服务器使用sctp_recvmsg调用读取数据.

关于客户:

客户端还创建一个SEQPACKET套接字并连接到命令行参数指定的IP地址.在这种情况下,getladdrs还返回3个地址,如服务器情况.之后,客户端开始向服务器发送数据,延迟一秒钟到服务器,直到用户使用Ctrl-C中断发送.

这是一些源代码:

服务器:

#define BUFFER_SIZE (1 << 16)
#define PORT 10000   

int sock, ret, flags;
int i;
int addr_count = 0;
char buffer[BUFFER_SIZE];
socklen_t from_len;

struct sockaddr_in addr;
struct sockaddr_in *laddr[10];
struct sockaddr_in *paddrs[10];
struct sctp_sndrcvinfo sinfo;
struct sctp_event_subscribe event;  
struct sctp_prim prim_addr; 
struct sctp_paddrparams heartbeat;
struct sigaction sig_handler;

void handle_signal(int signum);

int main(void)
{
    if((sock = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0)
        perror("socket");

    memset(&addr, 0, sizeof(struct sockaddr_in));
    memset((void*)&event, 1, sizeof(struct sctp_event_subscribe)); …
Run Code Online (Sandbox Code Playgroud)

c sockets linux sctp multihomed

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

英特尔TBB将在AMD处理器上运行?

可能重复:
AMD多核编程

英特尔TBB取决于处理器?它会在amd或ARM上运行吗(例如在meeGo下?)

c c++ multithreading intel tbb

12
推荐指数
2
解决办法
6864
查看次数

pszBuffer或类似的"psz"代表什么?

我知道这有点偏离主题,但我相信无论如何我都能得到答案." psz"代表什么pszBuffer或C/C++系统库中的类似变量?我看到很多变量以" psz" 为前缀,看起来像一个模式.

谢谢!

c

12
推荐指数
3
解决办法
5458
查看次数

有没有办法标记使用非重入C库调用?

我正在研究一个多线程的项目,并且想知道是否有办法让编译器标记使用对C库的非重入调用(例如strtok_r的strtok intsead)?如果没有,是否有一个不可重入的调用列表,所以我可以定期查看我的代码库?

一个相关的问题是,是否有办法标记3d方库使用非重入调用.

我假设重入意味着线程安全,但不一定反过来.是否有充分的理由在线程项目中使用非重入调用?

c c++ linux multithreading reentrancy

12
推荐指数
1
解决办法
1255
查看次数

在C中大步复制内存的最快方法?

我正在尝试尽快从RGBA图像数据中复制1或2个颜色通道(这是我的代码中最慢的一部分,它会减慢整个应用程序的速度).是否有快速的复制方式?

数据简单地布局为RGBARGBARGBA等,我只需复制R值,或者只需复制RG值.

到目前为止我所拥有的大致是复制R值:

for(int i=0; i<dataSize; i++){
    dest[i] = source[i*4];
}
Run Code Online (Sandbox Code Playgroud)

对于RG值,我正在做:

for(int i=0; i<dataSize; i+=2){
    dest[i] = source[i*2];
    dest[i+1] = source[(i*2)+1];
}
Run Code Online (Sandbox Code Playgroud)

所有数据都是无符号的1字节值.有更快的方法吗?我已经部分展开了循环(每次迭代执行64个值 - 超出该值的微不足道的加速).平台是Armv7(iOS),因此使用NEON(SIMD)可能很有用,不幸的是我没有经验!

遗憾的是,更改数据是由opengl的readPixels()函数提供的,而iOS不支持L,LA,RG等读取,据我所知.

c memory iphone stride

12
推荐指数
2
解决办法
3828
查看次数

指向C中的const字符串的指针

char *p = "string"; //creates pointer to constant string

char p[] = "string"; //just an array with "string"
Run Code Online (Sandbox Code Playgroud)

我只是有点困惑为什么它在第一个例子中创建一个指向常量字符串的指针?它不应该仅仅是指向内存中带有"字符串"的地方的指针吗?

c arrays pointers const

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

使用C API获取SQLite语句的受影响行数

我正在DELETE使用SQLite 3 C API 执行一个语句,我想知道如何获取受影响的行数.

不幸的是,没有诸如此类的功能sqlite3_affected_rows.

c sqlite rows-affected sql-delete

12
推荐指数
2
解决办法
9422
查看次数