问题标签 [gnu-coreutils]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 用于实现 rm、mv 和 cp 的 Linux API 调用
我正在用 C 编写自己的小 shell,或者至少我要从今天开始。我想实现三个功能。
remove file1
我需要什么系统调用?只需打开文件并删除其内容,或者除了使用之外还有系统调用删除文件rm
吗?
mycopy source destination
为此,我正在考虑有一个缓冲区并打开 file1 读入缓冲区并写出到 file2 但我不知道如何将其实际放入代码中,如果有人可以将一个小例子放在一起,这将有助于一堆。
move source destination
这只是实现复制和删除吗?
我的主要问题是使用我从未做过的 argv[] 参数,所以它对我来说是新的。
pipe - 核心工具;`pipe` 程序在哪里?
给定一个程序A
;我正在编写一个脚本,它运行以下命令;
A
对功能来说不是必需的,但简化了可用性。我有一个检查以确定是否A
可用;如果不是这种情况,我想A
用无操作程序(即pipe
程序 ( |
))替换。
这样我的命令就变成了;
我可以简单地根据是否可用进行分支A
,但这给我留下了重复的代码(命令的其余部分)。我考虑过使用命名管道,但这一切似乎都是不必要的解决方法。
我目前的解决方案是./pipe.sh
;if read -t 0; then cat; else echo "$*"; fi
,它启用了插入式解决方案,但不知何故感觉不对。
注意:替换A
为|
命令;
也不行。
c - 如何将 coreutils 跟踪到系统调用?
我正在尝试导航和理解whoami
(和其他 coreutils)一直到最低级别的源代码,就像一个练习一样。
到目前为止我的潜水:
实际的二进制文件在哪里?
which whoami
/usr/bin/whoami
它在哪里维护?
我如何获得来源?
git clone git://git.sv.gnu.org/coreutils
whoami
存储库中的源代码在哪里?
# find . | grep whoami
相关行(84):
这大约是我的兔子洞停止的地方。geteuid()
中提到gnulib/lib/euidaccess.c
,但未明确定义 AFAICT。它也在/usr/local/unistd.h
as中被引用,extern
但没有与抓取我可以看到的 uid 相关的繁重工作。
我主要是通过geteuid
在已知的系统标头中寻找并包括在内,因为我在回溯其定义时遇到了麻烦。
问题:我怎样才能进一步深入探索源代码geteuid()
?在不费力的情况下快速探索这个代码库的最有效方法是什么?
我在使用 Vim 和一些 ctags 的 Ubuntu 服务器 15.04 上(这对于导航现有系统头文件没有太大帮助)。我是一个糟糕的开发人员,这是我的学习方法,尽管我无法通过这个障碍。
sorting - 当我使用不同的字段分隔符时,为什么 coreutils 排序会给出不同的结果?
在命令行上使用sort
时,为什么排序顺序取决于我使用的字段分隔符?举个例子,
第二种情况不仅排序错误,而且在字段 2(其中az
< a
)和字段 3(其中a
< az
)之间不一致。
makefile - 将 Autotooled 项目编译为 LLVM 位码时出现链接器错误
我按照http://gbalats.github.io/2015/12/10/compiling-autotooled-projects-to-LLVM-bitcode.html#compiling-llvm-from-source-with-gold-plugin上的说明进行尝试将包括 coreutils 在内的各种项目编译到 LLVM IR。
我尝试使用 Clang 3.4 和一个简单的测试文件在 Ubuntu 14.04 上测试我的安装
如前所述,但失败了
但是,添加参数后,-B/usr/lib/gold-ld
我可以编译测试文件。
尽管如此,编译 coreutils 仍然失败并出现以下错误:
最后执行的命令是:
在 libver.a 和 libcoreutils.a 上手动执行 llvm-ranlib 不会改变结果。执行llvm-nm -s src/libver.a
打印以下内容:
但是,通过正常构建,输出如下:
llvm-ranlib 有问题吗?您对如何修复链接器错误有任何建议吗?
unix - io_blksize 似乎只是返回 IO_BUFSIZE
我最近开始阅读cat.c
并且对函数感到困惑io_blksize
,该函数定义如下:
和
现在,问题io_blksize
似乎总是 return IO_BUFSIZE
,为什么不直接定义函数:
在宏ST_BLKSIZE
中参数的作用是sb
什么?ST_BLKSIZE(sb)
似乎4096
总是回来。
busybox - Yocto busybox 覆盖 coreutils
我正在尝试将“加入”命令安装到我的 yocto 映像中。我已经安装了busybox,它没有加入的功能,但有一个coreutils的子集。Coreutils 确实具有加入功能,因此我需要从 coreutils 配方安装它。
如果我只使用带有 IMAGE_INSTALL += 的标准配方安装busybox 和coreutils,则某些程序符号链接到busybox,而有些程序则链接到coreutils,这对我来说是个问题。我如何告诉 coreutils 包只是在图像上安装“加入”并忽略所有其他 coreutils 数据?
algorithm - POSIX ls -R 是否规定了特定的遍历顺序?如果不是,那么哪种假设更有可能是可移植的:深度优先还是广度优先?
我正在开发一个存储与文件系统的 inode 树非常相似的系统。它已经具有该ls
命令的等效项,但尚不支持递归选项。我正在研究添加递归选项的实现选择。我想最大限度地提高了解 POSIX 的用户的熟悉度,ls
并最大限度地提高为使用 POSIX 的输出而编写的任何脚本的可移植性ls -R
。
它似乎ls -R
可以通过深度优先遍历或广度优先遍历来实现。但是,对于特定的遍历顺序是由规范决定还是保留为实现选择,我无法找到明确的答案。
在POSIX 文档中ls
,我找不到任何具体的答案。这是我能找到的与递归实现相关的唯一声明:
在处理 -R 选项时,实现应该遍历任意深度。对深度的唯一限制应该基于用完物理存储来跟踪未遍历的目录。
我还尝试查看nftw
. 同样,我在那里没有找到关于遍历顺序的具体说明。
对于一些经验测量,我在 CentOS 机器上进行了测试,那里的行为显然是深度优先遍历。
我不知道这是规范规定的行为,还是仅仅是 GNU coreutils 的实现细节。
我自己的观察是,文件系统中的目录结构往往比深度更宽。这表明深度优先通常是内存效率更高的实现选择,尽管可以提出广度优先的内存效率更高的反例。
规范中的任何地方都规定了遍历顺序吗?如果不是,那么深度优先遍历是否在实现中被广泛使用,因此比广度优先更安全?
linux - 是否可以使用 linux 内核运行 BSD 用户空间来替代 GNU coreutils?
我一直在寻找一个不适合嵌入式系统并且不使用许多流行发行版中的许多 GNU 实用程序的 linux 发行版。我想从用户空间开发一个使用 musl-libc、bsd 用户空间和 Plan 9 的(宠物项目)Linux 发行版。在我开始并可能浪费时间做不可能的事情之前,使用 BSD 用户空间作为 GNU coreutils 的替代品是否可行/实用?如果没有,有什么替代方案?