Tag: glibc

在C中读取unicode文件时出错

我想使用以下代码在C(Cygwin / GCC)中读取unicode文件: #include #include #include void split_parse(char* text){ char** res = g_strsplit(text, “=”, 2); printf(“Key = %s : “, res[0]); printf(“Value = %s”, res[1]); printf(“\n”); } int main(int argc, char **argv) { setenv (“CYGWIN”, “nodosfilewarning”, 1); GIOChannel *channel; GError *err = NULL; int reading = 0; const gchar* enc; guchar magic[2] = { 0 […]

有选择地抑制glibc链接警告?

glibc使用以下“技术”来生成链接警告…… #define link_warning(symbol, msg) \ __make_section_unallocated (“.gnu.warning.” #symbol) \ static const char __evoke_link_warning_##symbol[] \ __attribute__ ((used, section (“.gnu.warning.” #symbol __sec_comment))) \ = msg; 对于由此生成的特定链接警告,是否有任何命令行开关可以传递给ld或gcc以抑制它? (对于编译时警告,你可以使用`#pragma diagnostic foo ignore来抑制)

g_io_channel + socket = server,还只得到一个客户端? 用C语言

伙计们,这里ma代码: #include #include // gio channel #include //socket(); #include // structure #include // printf void deal(GIOChannel *in, GIOCondition condition, gpointer data) { struct sockaddr_storage income; int insock = g_io_channel_unix_get_fd(in); socklen_t income_len = sizeof(income); int newsock = accept(insock, (struct sockaddr*)&income, &income_len ); if(newsock == -1) { printf(“failure on newsock\n”); } char buff[128]; int recv_total = 0; […]

在C中取消定义类似函数的宏?

我试图对glibc做一些黑客攻击,我想知道是否有可能重新定义类似函数的宏? 例如, 具有以下宏: #define expm1(Val) __TGMATH_UNARY_REAL_ONLY (Val, expm1) 如何将expm1重新定义为: #define expm1(Val) __TGMATH_UNARY_REAL_IMAG (Val, expm1, cexpm1) 我想我必须取消之前的定义,但我不知道该怎么做。

如何将glibc库函数包装成自动使用’unsigned char’和’wchar_t’?

我总是使用char作为unsigned char ,使用wchar_t作为wint_t 。 鉴于此,是否存在一个解决方案来更改函数接口以使用这些类型有或没有重新编译glibc? 另请参阅此问题: 如何更改wchar.h以使wchar_t与wint_t的类型相同?

ftell(FILE * fd)和lseek(int fd,off_t offset,int whence)的结果之间的差异

考虑这个代码示例: #include #include #include int main() { //this file exists and contains data: “ABCDEFGHIJKLM” FILE* file = fopen(“file.txt”, “r”); char data[4]; long int pos = ftell(file); fseek(file, 0, SEEK_SET); fread(data, 4, 1, file); fseek(file, pos, SEEK_SET); printf(“ftell: %d\n”, ftell(file)); printf(“lseek: %d\n”, lseek(fileno(file), 0, SEEK_CUR)); fread(data, 1, 4, file); //this correctly prints A //but external function […]

setvbuf() – 当buf为NULL时的size参数

看来,当我运行以下代码时: #include #include int main(int argc, char* argv) { int i=0; setvbuf(stdout, NULL, _IOLBF,0); while (1) printf(“%d “,i++); return 0; } 它打印成1024个字符的块,无论我为setvbuf()定义的大小 。 问题是,在这种情况下,如果大小会以某种方式影响,那么1024个字符的定义来自何处。

为什么islower()和朋友需要处理EOF?

为什么islower()和朋友需要处理EOF ,而putchar()和朋友不需要? 为什么islower()将int作为unsigned char ,就像putchar() ? 这将是完全有道理的,因为我们必须首先检查EOF 。 另请参见为什么putchar() , fputc()和putc()的参数类型不是char ?

提示编译器可以使用对齐的memcpy

我有一个由7个__m256值组成的结构,它在内存中以32字节对齐的方式存储。 typedef struct { __m256 xl,xh; __m256 yl,yh; __m256 zl,zh; __m256i co; } bloxset8_t; 我通过对动态分配的数据使用posix_memalign()函数或对静态分配的数据使用(aligned(32))属性来实现32字节对齐。 对齐很好,但是当我使用两个指向这样的结构的指针,并将它们作为memcpy()的目标和源传递时,编译器决定使用__memcpy_avx_unaligned()进行复制。 我怎样才能强制clang使用对齐的avx memcpy函数,我认为它是更快的变体? 操作系统:Ubuntu 16.04.3 LTS,Clang:3.8.0-2ubuntu4。 UPDATE 仅在复制两个或多个结构时才会调用__memcpy_avx_unaligned()。 当只复制一个时,clang会发出14个vmovup指令。

为什么stdout无法替代?

出于教育目的,我试图用标准流替换stdout,stdin和stderr。 我首先查找了流的数据类型,我追溯到带有以下成员的struct _IO_FILE(gdb ptype _IO_FILE): type = struct _IO_FILE { int _flags; char *_IO_read_ptr; char *_IO_read_end; char *_IO_read_base; char *_IO_write_base; char *_IO_write_ptr; char *_IO_write_end; char *_IO_buf_base; char *_IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; short unsigned int _cur_column; signed char _vtable_offset; char _shortbuf[1]; […]