经过相当长的一段时间后,我正在用C做一个小项目.这些碰巧包括一些文件处理.我在各种文档中注意到有返回FILE *句柄的函数和返回(小整数)描述符的其他函数.这两组功能都提供了我需要的相同基本服务,所以我使用它并不重要.
但我对收藏智慧感到好奇:使用fopen()和朋友,还是open()朋友更好?
编辑因为有人提到缓冲与未缓冲和访问设备,我应该补充说,这个小项目的一部分将在FUSE下编写用户空间文件系统驱动程序.因此,文件级访问可以像在"文件"(即图像)上一样容易地在设备(例如CDROM或SCSI驱动器)上.
我在运行以下汇编代码时遇到错误
#cpuid using C library Functions
.section .data
output:
.asciz "The Processor Vendor ID is '%s'\n"
.section .bss
.lcomm buffer, 12
.section .text
.globl main
main:
movq $0, %rax
cpuid
movq $buffer, %rdi
movq %rbx, (%rdi)
movq %rdx, (%rdi)
movq %rcx, (%rdi)
pushq $buffer
pushq $output
call printf
addq $8, %rsp
pushq $0
call exit
Run Code Online (Sandbox Code Playgroud)
它遇到了C库部分的分段错误调用:call printf它在x86_64模式下运行.在编译x64代码时,我错过了关于c库的任何内容?或者代码有问题
谢谢
我正在使用几乎没有OS支持的自定义用户空间环境:只有一个char设备,大容量存储接口和一个网络套接字.
为了向这个平台提供C编程,我需要一个libc.是否有任何可配置的libc项目,以便我可以将低级IO映射到我有权访问的小API?
AFAIK glibc和uclibc期待linux系统调用,所以我不能使用它们(不试图模拟linux系统调用,这是我更喜欢避免的).
什么是"W"的助记符,即"W"在以下宏中的含义:
int WIFEXITED (int status)
int WEXITSTATUS (int status)
int WIFSIGNALED (int status)
int WTERMSIG (int status)
int WCOREDUMP (int status)
int WIFSTOPPED (int status)
int WSTOPSIG (int status)
Run Code Online (Sandbox Code Playgroud)
另请参阅流程状态完成.
在一个项目中,我的同事创建了一个静态库,例如liba.a,它与app链接.
在liba.a中,他将libc malloc()覆盖为其所有者版本.
我创建了一个共享库libs.so,它也与app链接.
问题是当我的libs.so与app链接时,我的libs.so中使用的malloc()将是liba.a中的那个,而不是标准libc.so中的那个,这会导致问题.
然后,我想将libc.a静态链接到我的libs.so,我为gcc使用了-static -shared -fPIC标志.
但我总是得到arm-2012.03/bin /../ lib/gcc/arm-none-linux-gnueabi/4.6.3 /../../../../ arm-none-linux-gnueabi/bin/ld:arm-2012.03/bin /../ arm-none-linux-gnueabi/libc/usr/lib/libc.a(dl-tsd.o)(.text + 0x14):共享对象中不允许R_ARM_TLS_LE32重定位.
有没有人有这个想法?
谢谢你.
我遇到这个页面,发现有一个奇怪的浮动乘法加法 函数 - fma和fmaf.它说结果是这样的:
(x * y) + z #fma(x,y,z)
Run Code Online (Sandbox Code Playgroud)
并且值是无限精度并且对结果格式进行一次舍入.
然而,AFAICT我以前从未见过这样的三元手术.所以我想知道这个功能的cumstom用法是什么.
我正在尝试读取同时写入磁盘的文件.我需要阅读特定大小的块.如果读取的大小小于特定大小,我想要读取文件(类似于ungetc所做的,而不是char []),然后再试一次.附加到已读取的字节对我来说不是一个选项.
这怎么可能?
我尝试通过以下方式保存当前位置:
FILE *fd = fopen("test.txt","r+");
fpos_t position;
fgetpos (fd, &position);
Run Code Online (Sandbox Code Playgroud)
然后读取文件并将指针放回其前面的位置.
numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd)
if (numberByBytes < desiredSize) {
fsetpos (fd, &position);
}
Run Code Online (Sandbox Code Playgroud)
但它似乎没有奏效.
glibc并且eglibc有一个PTR_MANGLE,它加密可写内存中的指针(更准确地说,'XOR'而不是'加密').
我没有找到关于该功能的更多阅读.man -k PTR_MANGLE返回没有点击,谷歌正在返回一些肤浅的喋喋不休.Drepper 在Live Journal上的Pointer加密是为数不多的权威文章之一.
有没有深入的文件?它可以扩展到用户空间进程,还是仅限于运行时库?如果是这样,启用该功能的编译器开关或选项是什么?可以在运行时禁用该功能吗?
我在Ubuntu 16.04 64位上使用gcc 5.4.0.当我编译一个程序时:
gcc -o prog prog.c
Run Code Online (Sandbox Code Playgroud)
GCC自动链接到C标准库,所以我没有专门这样做.
提前致谢.
fgets() was intended for reading some string until EOF or \n occurred. It is very handy for reading text config files, for example, but there are some problems.
First, it may return EINTR in case of signal delivery, so it should be wrapped with loop checking for that.
Second problem is much worse: at least in glibc, it will return EINTR and loss all already read data in case it delivered in middle. This is very unlikely to happen, but …