小编Ram*_*Ram的帖子

核心文件大小限制对进程具有非确定性影响

我正在运行自定义2.6.27内核,我只是注意到在段错误期间生成的核心文件大于为进程设置的硬核文件大小限制.

更令人讨厌的是,核心文件有时只会被截断(但不会受到ulimit设置的限制).

例如,这是我将尝试崩溃的程序:

int main(int argc, char **argv)
{
    // Get the hard and soft limit from command line
    struct rlimit new = {atoi(argv[1]), atoi(argv[1])};

    // Create some memory so as to beef up the core file size
    void *p = malloc(10 * 1024 * 1024);

    if (!p)
        return 1;

    if (setrlimit(RLIMIT_CORE, &new)) // Set the hard and soft limit
        return 2;                     // for core files produced by this
                                      // process

    while (1);

    free(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是执行: …

c linux coredump

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

C qsort无法正常工作

我不知道我做错了什么,但以下代码没有正确排序数组.

#include <stdio.h>
#include <stdlib.h>

int compare(const void* a, const void* b)
{
    return (*(int*)a - *(int*)b);
}

int main()
{
    int x[] = { -919238029,
            -889150029,
            -826670576,
            -579609061,
            -569653113,
            -305140505,
            -216823425,
            -193439331,
            -167683147,
            -49487019,
            -45223520,
            271789961,
            275570429,
            444855014,
            559132135,
            612312607,
            664554739,
            677860351,
            1005278191,
            1031629361,
            1089012280,
            1115952521,
            1521112993,
            1530518916,
            1907515865,
            1931470931,
            -1631034645,
            -1593702794,
            -1465300620,
            -1263094822
         };
    int i;

    qsort(x, 30, sizeof(int), compare);
    for(i = 0; i < 30; i ++)
        printf("%d\n", x[i]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

1521112993
1530518916
1907515865
1931470931 …
Run Code Online (Sandbox Code Playgroud)

c qsort

12
推荐指数
2
解决办法
8352
查看次数

Bash decimal to base 62 conversion

我想反转以下bash命令执行的操作:

$ echo $((62#a39qrT))
9207903953
Run Code Online (Sandbox Code Playgroud)

即将十进制9207903953转换为基数62,保持bash标准{0..9},{a..z},{A..Z}.

我知道我可以通过使用来实现这一点bc,但我必须手动转换每个字符.例如,我目前这样做:

BASE62=($(echo {0..9} {a..z} {A..Z}))
for i in $(echo "obase=62; 9207903953" | bc)
do
    echo -n ${BASE62[$i]} #Doesn't work if bc's output contains leading zeroes
done
Run Code Online (Sandbox Code Playgroud)

必须有一种方法以较少"黑客"的方式做到这一点.你知道如何更有效地做到这一点吗?

编辑:更改bc输入.

bash shell base-conversion bc

10
推荐指数
1
解决办法
3643
查看次数

清除/ proc/meminfo中的"缓存"内存而不使用drop_caches

我有一个运行2.6.10 linux内核的嵌入式系统(我知道!)而且我注意到随着系统保持更长时间,RAM的"缓存"使用 - 如/ proc/meminfo中所示 - 线性增加.有时它达到总RAM的70%,系统崩溃.

  1. 我不知道为什么在低内存条件下内核不会自动重新声明这个空间.我认为"缓存"内存虽然被使用,仍然被认为是"可用的".

  2. 为了至少手动回收这个空间,我必须调整/ proc/sys/vm /中的drop_caches设置.但是,此功能仅在2.6.16内核中引入.

由于"缓存"中的很大一部分是页面缓存,文件和inode缓存,有没有办法在没有drop_caches功能的情况下正式回收它们?我试过了sync,但这根本没有用.

我已经搜索了很多关于此但是找不到任何不依赖于drop_caches功能的资源.

编辑:

根据其他一些线程的建议,我运行了一个测试,每隔一秒写入板载闪存分区,我看到两个dentrysize-64字段都进入/proc/slabinfo(以每个循环的bash脚本1的速率).但是,我没有注意到Cached内存使用量有任何增加.

更多信息:

我必须提到根目录本身是在ramfs中.我有一个我们读/写的闪存芯片,但是太频繁了.我在坠机前的某个时候粘贴了meminfo和slabinfo.注意活动和缓存字段如何添加到大于总可用内存!

MemTotal:       256708 kB
MemFree:          4896 kB
Buffers:             0 kB
Cached:         181892 kB
SwapCached:          0 kB
Active:         178140 kB
Inactive:        46496 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       256708 kB
LowFree:          4896 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
Mapped:          56656 kB
Slab:            11252 kB …
Run Code Online (Sandbox Code Playgroud)

linux memory caching memory-management

10
推荐指数
1
解决办法
2465
查看次数

Bash脚本:无法正确处理SIGTSTP

我有一个bash脚本,可以安装和卸载一个设备,在其间执行一些读取操作.由于设备非常慢,脚本需要大约15秒才能完成(安装至少需要5-6秒).由于安装此设备可能会导致其他问题,我不希望此脚本被中断.

话虽如此,我可以正确处理SIGINT(Ctrl + c),但是当我尝试处理SIGTSTP(Ctrl + z)时,脚本会冻结.这意味着信号被捕获但处理程序不运行.

#!/bin/sh
cleanup()
{
    # Don't worry about unmounting yet. Just checking if trap works.
    echo "Quitting..." > /dev/tty
    exit 0
}
trap 'cleanup' SIGTSTP
...
Run Code Online (Sandbox Code Playgroud)

我手动必须将KILL信号发送到进程.知道为什么会发生这种情况以及如何解决这个问题吗?

linux bash signals bash-trap

9
推荐指数
1
解决办法
1679
查看次数

linux内核模块中内核线程之间的通信

我刚刚开始学习在 linux 内核 2.6 上制作内核模块的技巧。我想要做的是有 3 个内核线程,称为从线程,需要将数据发送到第 4 个内核线程,称为主线程,并接收它们各自的响应。slaves 可以随时请求,这意味着我需要某种队列结构和一种将响应重定向到正确线程的方法。

首先,我着眼于实现我自己的队列结构来对传入的请求进行排队 - 但我如何向主人发出信号?我不希望主人继续轮询(如自旋锁/信号量的情况)。我有一种感觉,在线程之间有更好的通信方式。

由于缺乏文档(以及公认的较差的搜索技能),我对如何实现这一点感到茫然。你能为我指出正确的方向吗?

multithreading ipc kernel-module linux-kernel

5
推荐指数
1
解决办法
1880
查看次数

Linux的安全措施反对执行shellcode

我正在学习计算机安全的基础知识,并且我正在尝试执行一些我写过的shellcode.我按照这里给出的步骤

http://dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf

http://webcache.googleusercontent.com/search?q=cache:O3uJcNhsksAJ:dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf+own+shellcode&cd=1&hl=nl&ct=clnk&gl=nl

$ cat pause.s
xor %eax,%eax
mov $29,%al     
int $0x80       
$ as -o pause.o pause.s
$ ld -o pause pause.o
ld: warning: cannot find entry symbol _start; defaulting to <<some address here>>
$ ./pause 
^C
$ objdump -d ./pause
pause:     file format elf64-x86_64
Disassembly of section .text:
      08048054 <.text>:
      8048054: 31 c0     xor    %eax,%eax
      8048056: b0 1d     mov    $0x1d,%al
      8048058: cd 80     int    $0x8
$
Run Code Online (Sandbox Code Playgroud)

由于我让暂停程序工作,我只是将objdump输出复制到ac文件.

test.c的:

int main()
{
    char s[] = "\x31\xc0\xb0\x1d\xcd\x80";
    (*(void(*)())s)();
}
Run Code Online (Sandbox Code Playgroud)

但这会产生段错误.现在,这只能归功于Arch Linux(?)的安全措施.那我怎么能让它运作起来呢?

x86-64 linux-kernel archlinux shellcode

2
推荐指数
1
解决办法
1532
查看次数