Articles of BSD

在我的程序中使用OpenBSD的malloc,realloc和free

我想在我的Debian lenny桌面上使用OpenBSD的malloc,realloc和free,而不是glibc。 他们是否只是在replace:他们会在我的Linux桌面上工作? 哪些是我需要的文件,哪些OpenBSD软件包包含它们?

如何将常规文件转换为Linux上的符号链接

我正在写一个(un)归档工具,它的devise方式是在它检查特殊属性之前首先从归档创build一个常规文件,并且可能会决定这个项目实际上是一个符号链接。 注意:在更多的人误解我想要做一个文件的符号链接之前 。 不,我将符号链接数据,即其path写入文件,然后我想告诉文件系统这是一个符号链接 我一直在OS X上进行开发,只需简单地设置Type和Creator代码就可以将常规文件转换为符号链接。 现在我想让这个代码在Linux上工作。 所以我喜欢在那里find类似的方式。 我知道创build符号链接的正常方法是调用symlink()函数,但是我想知道是否还有一种方法可以将常规文件更改为符号链接,就像在OSX的BSD系统中一样,这样我不必重构我的工作代码太多? 有lstat(),它返回st_mode最高位的文件types。 现在我想知道这个模式字段是否也有类似的setter函数。

好的C库集合?

我正在为ANSI-C寻找一个好的库集合,用于处理向量的东西,哈希映射,二进制发辫,string处理等等。

如何使用sys / queue.h中的列表?

目前,我已经实施了一个单独的链接列表,如下所示: struct PeerNode { struct Peer* cargo; struct PeerNode* next; }; …我有一个包含这些链表的结构,如下所示: struct Torrent { … struct PeerNode* peer_list; struct PeerNode* unchoked_peers; … } 我想通过使用sys/queue.h提供的macros来replace它。 我收集,我可以用这样的东西replace我的代码: struct Torrent { … LIST_ENTRY(PeerNode, Peer) peer_list; struct PeerNode* unchoked_peers; … } 然后,从看man queue ,我相信我会通过这样做来初始化列表: LIST_INIT(&peer_list); LIST_INIT(unchoked_peers); 不过,我不明白LIST_ENTRY如何转化为列表的用法。 从man页上,它说:“macrosLIST_ENTRY声明一个连接列表中的元素的结构,”但我不明白这是什么意思。 为什么我要声明一个结构来连接列表中的元素? 每个节点不应该通过指针连接到下一个节点,就像我的初始链表实现? 我怎样用sys/queue.h提供的实现来replace我的链表? 我将如何插入一个元素到列表中?

在POSIX系统上`fileno(stdout)!= 1`可能吗?

可以stdout文件描述符不同于1 ( STDOUT_FILENO )假设stdout不需要是一个可修改的左值 ? 例如,可以freopen("/dev/null", "w", stdout)更改fileno(stdout)结果?

从内部检测一个chroot监狱

如何检测没有root权限的chroot监狱? 假设一个标准的BSD或Linux系统。 我想到的最好的方法是查看“/”的inode值,并考虑是否合理低,但是我想要一个更准确的检测方法。 [edit 20080916 142430 EST]文件系统是不够的,因为复制像/ boot和/ dev这样的东西来欺骗被监禁的用户并不困难。 [edit 20080916 142950 EST]对于Linux系统来说,检查/ proc中的意外值是合理的,但是那些首先不支持/ proc的系统呢?

不检查close()的返回值:真的有多严重?

Linux的“man close”警告(SVr4,4.3BSD,POSIX.1-2001): 不检查close()的返回值是一个常见但严重的编程错误。 先前的write(2)操作的错误很可能会在最后的close()中被首先报告。 在closures文件时不检查返回值可能会导致数据无提示丢失。 这尤其可以通过NFS和磁盘配额来观察。 我可以相信这个错误是常见的 (至less在应用程序中,我不是内核黑客)。 但是,今天或过去三十年的任何时候,这种情况有多严重呢? 尤其是: 有没有一个简单的,可重复的例子,这种无声的数据丢失? 即使是在close()期间发送SIGKILL的一个人造的一个? 如果存在这样一个例子,数据丢失可以比正常更优雅地处理 printf("Sorry, dude, you lost some data.\n"); ?

execve文件没有find时,正在使用相同的文件!

我认识的某人在运行“ lmutil ”时遇到了问题,所以我要求他们去解决问题。 execve为什么没有“没有这样的文件”!!! 这是没有意义的,因为我正在压缩同一个文件! 这到底是什么? strace -f /home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil 输出: execve("/home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil", ["/home/tabitha/Starprogram/FLEXlm"…], [/* 38 vars */]) = -1 ENOENT (No such file or directory) dup(2) = 3 fcntl(3, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE) fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), …}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd7cb8b0000 lseek(3, 0, SEEK_CUR) = -1 ESPIPE (Illegal […]

在运行时确定操作系统

ISO C和POSIX都不提供在运行时确定底层操作系统的function。 从理论的angular度来看,这并不重要,因为C为最常见的系统调用提供了包装,并且从挑选的angular度来看,甚至不必是基础操作系统。 然而,在许多现实世界的场景中,已经certificate比C愿意分享更多关于主机环境的certificate是有帮助的,例如为了找出在哪里存储configuration文件或者如何调用select() ,所以: 用C编写的应用程序是否有一种习惯用法来确定运行时的底层操作系统? 至less,我可以在Linux,Windows,BSD和MacOS之间轻松做出决定吗? 我目前的猜测是检查某些文件/目录的存在,如C:\或/ ,但这种方法似乎不可靠。 也许查询一系列这样的来源可能有助于build立“操作系统指纹”的概念,从而提高可靠性。 无论如何,我期待着你的build议。