小编cat*_*cat的帖子

Mono到底有多神奇?

我正在学习 C#,所以我做了一个 C# 小程序,上面写着Hello, World!,然后用以下命令编译mono-csc并运行它mono

$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Run Code Online (Sandbox Code Playgroud)

我注意到当我TAB输入bash,Hello.exe被标记为可执行文件。事实上,它只通过一个加载文件名的 shell 运行!

Hello.exe不是有一个有趣的文件扩展名的ELF文件:

$ readelf -a Hello.exe
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start
$ xxd Hello.exe | head -n1
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000  MZ..............
Run Code Online (Sandbox Code Playgroud)

MZ意味着它是 Microsoft Windows 静态链接的可执行文件。把它放到一个 Windows 盒子上,它就会(应该)运行。

我已经wine安装了,但是wine,是用于的Windows应用程序的兼容层,需时约5倍,只要运行 …

linux mono executable cross-compilation

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

在 QEMU 中启动原始磁盘映像

我有一个来自这里的磁盘映像文件;该页面说我可以使用 QEMU 和以下命令启动此映像:

$ qemu-system-x86_64  -m 4096  -ctrl-grab  -no-reboot  x86-64.img
Run Code Online (Sandbox Code Playgroud)

这给出了一个信息:

WARNING: Image format was not specified for 'x86-64.img' and probing guessed raw.
     Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
     Specify the 'raw' format explicitly to remove the restrictions.
Run Code Online (Sandbox Code Playgroud)

模拟器加载,但 PilOS 崩溃,这意味着我做错了什么:

(可能是因为 PilOS 想写入块 0 但不能)

raw命令行参数,据我所知,这意味着这样传递:

$ qemu-system-x86_64 -drive format=raw file=x86-64.img 
qemu-system-x86_64: -drive format=raw: drive with bus=0, unit=0 (index=0) exists
Run Code Online (Sandbox Code Playgroud)

这失败了(我认为),因为我的引导设备在/dev/sda总线 0 …

virtual-machine qemu disk-image

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

'sort -u' 对巨大文件的可扩展性

'sort -u' 的合理可扩展性限制是多少?(在“行长”,“行数”,“总文件大小”的维度?)

对于在“行数”维度上超过此值的文件,Unix 替代品是什么?(当然我可以轻松实现一个,但我想知道是否有一些标准的 Linux 命令可以完成?)

sort

24
推荐指数
1
解决办法
5133
查看次数

不会溢出到硬件资源的动态流压缩?

我有 200 GB 的可用磁盘空间、16 GB 的 RAM(其中约 1 GB 被桌面和内核占用)和 6 GB 的交换空间。

我有一个 240 GB 的外部 SSD,使用了 70 GB 1,其余的免费,我需要将其备份到我的磁盘。

通常,我会dd if=/dev/sdb of=Desktop/disk.img先创建磁盘,然后对其进行压缩,但是首先制作映像不是一种选择,因为这样做需要比我拥有的磁盘空间多得多的磁盘空间,即使压缩步骤会导致可用空间被压缩,因此最终存档可以很容易地放在我的磁盘上。

dd默认情况下写入 STDOUT,并且gzip可以从 STDIN 读取,所以理论上我可以写入dd if=/dev/sdb | gzip -9 -,但gzip读取字节所需的时间比dd产生它们的时间要长得多。

来自man pipe

写入管道写端的数据由内核缓冲,直到从管道的读端读取。

我将 a 想象|成一个真正的管道——一个应用程序将数据推入,另一个应用程序尽可能快地从管道队列中取出数据。

当左侧的程序写入的数据比管道的另一侧希望处理的数据多时,该怎么办?它会导致极端的内存或交换使用,还是内核会尝试在磁盘上创建一个 FIFO,从而填满磁盘?或者SIGPIPE Broken pipe如果缓冲区太大它会失败吗?

基本上,这归结为两个问题:

  1. 将多于一次读取的数据推入管道的含义和结果是什么?
  2. 将数据流压缩到磁盘而不将整个未压缩的数据流放在磁盘上的可靠方法是什么?

注 1:我不能仅仅复制前 70 个使用的 GB 并期望获得一个工作系统或文件系统,因为碎片和其他需要完整内容完整的东西。

pipe compression gzip dd

24
推荐指数
4
解决办法
8831
查看次数

为什么在参数中间有一个 EOF?

我想编写一个小 bash 函数,以便我可以告诉 bash,import os或者from sys import stdout它会生成一个新的 Python 解释器,并导入模块。

后一个from函数如下所示:

from () {
    echo "from $@" | xxd
    python3 -i -c "from $@"
}
Run Code Online (Sandbox Code Playgroud)

如果我这样称呼:

$ from sys import stdout
00000000: 6672 6f6d 2073 7973 2069 6d70 6f72 7420  from sys import 
00000010: 7374 646f 7574 0a                        stdout.
  File "<string>", line 1
    from sys
           ^
SyntaxError: invalid syntax
>>> 
Run Code Online (Sandbox Code Playgroud)

中的字节from sys

66 72 6f 6d 20 73 79 73 20
f …
Run Code Online (Sandbox Code Playgroud)

bash python

20
推荐指数
4
解决办法
3457
查看次数

为什么 Enter 键不发送 EOL?

Unix / Linux EOL 是 LF、换行、ASCII 10、转义序列\n

这是一个 Python 代码片段,可以准确地获得一个按键:

import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
    tty.setraw(sys.stdin.fileno())
    ch = sys.stdin.read(1)
finally:
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch
Run Code Online (Sandbox Code Playgroud)

当我按下Enter键盘以响应此代码段时,它给出了\r回车符 ASCII 13。

Windows 上Enter发送CR LF == 13 10. *nix 不是 Windows;为什么Enter给 13 而不是 10?

command-line terminal ascii newlines

19
推荐指数
2
解决办法
5437
查看次数

将输出发送到 /dev/stderr vs. &gt;&amp;2

在脚本中,错误通常用 发送到文件描述符 2 &2,即:

echo "error" >&2
Run Code Online (Sandbox Code Playgroud)

有时/dev/stderr改为使用:

echo "error" > /dev/stderr 
Run Code Online (Sandbox Code Playgroud)

看着/dev/stderr,我看到它只是到 的符号链接/proc/self/fd/2,而后者又是到/dev/pts/5(在我当前的终端上)的符号链接。

看起来有点过于复杂了。这背后有什么逻辑吗?

使用/dev/stderr&2等效吗?

其中任何一个都比另一个更受欢迎吗?

portability stderr

13
推荐指数
2
解决办法
8393
查看次数

看到用于调试的 Bash 变量的扩展吗?

是否有任何工具/技巧可用于扩展变量以使 bash 代码更易于阅读?

例如,它将转换以下内容:

DIR=/var/tmp
FILE=${DIR}/file
SCRIPT_ROOT=/opt/root
TOOL=${SCRIPT_ROOT}/tool.sh
${TOOL} ${FILE}
Run Code Online (Sandbox Code Playgroud)

到:

DIR=/var/tmp
FILE=/var/tmp/file
SCRIPT_ROOT=/opt/root
TOOL=/opt/root/tool.sh
/opt/root/tool.sh /var/tmp/file
Run Code Online (Sandbox Code Playgroud)
  • 我正在将 BASH 代码转换为 Python 并且阅读 BASH 语法非常乏味。

bash variable-substitution variable

13
推荐指数
1
解决办法
1173
查看次数

在 bash 中反转十六进制数

是否有一个简单的命令来反转十六进制数?

例如,给定十六进制数:

030201
Run Code Online (Sandbox Code Playgroud)

输出应该是:

010203
Run Code Online (Sandbox Code Playgroud)

使用该rev命令,我得到以下信息:

102030
Run Code Online (Sandbox Code Playgroud)

更新

$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.20.1
Run Code Online (Sandbox Code Playgroud)

command-line numeric-data hex

10
推荐指数
4
解决办法
8226
查看次数

OOM 迭代非常大的内存映射

我正在编写一个模拟器,它依赖于生成(可能)非常大的问题域。由于数据无法放入 RAM,我使用 4 个四内存映射文件来保存它。这是一个在 64 位 Linux 上运行的 64 位应用程序,具有 8GB 的​​ RAM。

我的应用程序在多个线程中迭代内存映射并对它们执行读写操作。但是我的程序在启动后不久导致 OOM(没有发生颠簸):

[  683.899682] Purging GPU memory, 25 pages freed, 12838 pages still pinned.
[  683.899683] 50 and 0 pages still available in the bound and unbound GPU page lists.
[  683.899732] Purging GPU memory, 0 pages freed, 12838 pages still pinned.
[  683.899732] 50 and 0 pages still available in the bound and unbound GPU page lists.
[  683.901441] gnome-shell invoked oom-killer: gfp_mask=0x240c0d0(GFP_TEMPORARY|__GFP_COMP|__GFP_ZERO), order=3, oom_score_adj=0
[ …
Run Code Online (Sandbox Code Playgroud)

linux memory mmap virtual-memory out-of-memory

7
推荐指数
1
解决办法
905
查看次数