关于Linux命令行使用的集中贴

谢谢,搞定~

1 个赞

cnblogs/csdn上的工程blog真的基本都是胡言乱语
就算是OIer blog还是有一堆不符合工程规范的垃圾代码发在blog上
毕竟竞赛快餐代码写多了其实有些工程问题是不会去考虑的(

3 个赞

orz收藏了等下有空再看(

2 个赞

但是它们在oi意义上还是有价值的呀(

2 个赞

啊对… 最权威的东西一定是官方的文档, 标准之类的. 至少在入门阶段这么相信就好…
(因为有些屑东西是真的是同人比官方还好的屑, 不过都非常小众就是了((((((

比如这些就蛮有用的(并不一定官方, 但这些是真的同人逼死官方了):

  • MDN: https://developer.mozilla.org web开发的文档这里都有了
  • open-std: https://open-std.org c++标准/草案, 不过建议搜索而非直接访问(
  • cppreference: https://en.cppreference.com 大概算是比较好和全的c/c++文档
  • man 一个*NIX命令, 所有程序如果自带文档的话都可以man到了(
    (恐男的话… info也可以, 不过似乎没有那么全…
  • stackoverflow (懒得打网址) 官方文档里不会有的"智障"问题都可以在这里找到()
    但是也不要抱太高期望(((
2 个赞
alias man="info"
alias woman="info"
alias lgbt="info"
alias lgbtq="info"
alias lgbtqi="info"
alias lgbtqia="info"
alias lgbtqiap="info"
alias lgbtqiapk="info"
6 个赞

man的优点是好打((((

alias qwq=man

((((((

2 个赞

看起来还不错?

alias qaq="man"
2 个赞

alias这么用真的不会炸吗x
(反正zsh会x(((((((

试试这样

$ echo 'nya~' > girl
$ cat girl
nya~

我几乎每台 Linux 设备里都有这么个 girl 文件

7 个赞

alias wtf=man (

3 个赞

nyanya~

2 个赞

真·猫娘?(

1 个赞

想到了 /dev/horo (@Horo

2 个赞

唔… 改内核让/dev/girl包含无限的"nya~"?((((((((((

什么嘛怎么又20%了((((((
锦心酱明显比senioria bb得多得多嘛… (小声((((((((((

1 个赞

草,这个可以有

怎么改

2 个赞

不知道, 源代码里没grep到/dev/zero的实现><


找到了找到了!(虽然不知道对不对(((

枯燥的翻代码过程...

drivers/char/mem.c里:

938行(似乎几乎是最后了)有关于特殊设备的定义(senioria删了所有条件编译):

static const struct memdev {
    // 省略
} devlist[] = {
	 [3] = { "null", 0666, &null_fops, 0 },
	 [5] = { "zero", 0666, &zero_fops, 0 },
	 [7] = { "full", 0666, &full_fops, 0 },
	 [8] = { "random", 0666, &random_fops, 0 },
	 [9] = { "urandom", 0666, &urandom_fops, 0 },
};

再往上一点, 920行, 就是对/dev/zero的fops的定义:

static const struct file_operations zero_fops = {
	.llseek		= zero_lseek,
	.write		= write_zero,
	.read_iter	= read_iter_zero,
	.write_iter	= write_iter_zero,
	.mmap		= mmap_zero,
	.get_unmapped_area = get_unmapped_area_zero,
#ifndef CONFIG_MMU
	.mmap_capabilities = zero_mmap_capabilities,
#endif
};

write, seek之类的操作可以直接抄zero的(), 然后mmap的话, 涉及到一个shmem_zero_setup函数, 它的定义在mm/shmem.c:4251:(删了注释)

int shmem_zero_setup(struct vm_area_struct *vma)
{
	struct file *file;
	loff_t size = vma->vm_end - vma->vm_start;

	file = shmem_kernel_file_setup("dev/zero", size, vma->vm_flags);
	if (IS_ERR(file))
		return PTR_ERR(file);

	if (vma->vm_file)
		fput(vma->vm_file);
	vma->vm_file = file;
	vma->vm_ops = &shmem_vm_ops;

	if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
			((vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK) <
			(vma->vm_end & HPAGE_PMD_MASK)) {
		khugepaged_enter(vma, vma->vm_flags);
	}

	return 0;
}

这里直接改一下名字就好, 大概(
diff了一下两个mmap的实现, 差别确实有点大… 但是既然我们这个文件是仿着/dev/zero实现的(虽然其实大概更像/dev/random(((), 照抄似乎也没问题(

然后重点是read, 709行有read的定义:

static ssize_t read_iter_zero(struct kiocb *iocb, struct iov_iter *iter)
{
	size_t written = 0;

	while (iov_iter_count(iter)) {
		size_t chunk = iov_iter_count(iter), n;

		if (chunk > PAGE_SIZE)
			chunk = PAGE_SIZE;	/* Just for latency reasons */
		n = iov_iter_zero(chunk, iter);
		if (!n && iov_iter_count(iter))
			return written ? written : -EFAULT;
		written += n;
		if (signal_pending(current))
			return written ? written : -ERESTARTSYS;
		cond_resched();
	}
	return written;
}

比较重要的是那个iov_iter_zero, 它的定义在lib/iov_iter.c:974:

size_t iov_iter_zero(size_t bytes, struct iov_iter *i)
{
	if (unlikely(iov_iter_is_pipe(i)))
		return pipe_zero(bytes, i);
	iterate_and_advance(i, bytes, v,
		clear_user(v.iov_base, v.iov_len),
		memzero_page(v.bv_page, v.bv_offset, v.bv_len),
		memset(v.iov_base, 0, v.iov_len)
	)

	return bytes;
}
EXPORT_SYMBOL(iov_iter_zero);

然后发现用到了一个叫memzero_page的函数, 它的定义是这样的:

static void memzero_page(struct page *page, size_t offset, size_t len)
{
	char *addr = kmap_atomic(page);
	memset(addr + offset, 0, len);
	kunmap_atomic(addr);
}

总结一下就是, 感觉照着senioria这一串改一下就好, 然后最后的memgirl_page大概可以这么实现:

static void memzero_page(struct page *page, size_t offset, size_t len)
{
	char *addr = kmap_atomic(page);
    static const char girlsay[] = "nya~";
    static const int saylen = 4;
    // memset在这里会有锅, senioria只会暴力塞><
    for (char *pos = girlsay + (offset % saylen); len--; )
    {
        page[offset++] = *pos;
        if (++pos == girlsay + saylen)
            pos = girlsay;
    }
	kunmap_atomic(addr);
}

并没有测试过… ><(

3 个赞

现 在 不 是 了
https://limelight.moe/u

1 个赞

诶91水了91个帖诶(大雾(((

以及最好不要在脱水菜板里水啦

2 个赞

写的挺入门的 语气有点像 Linus
求一个 zsh tutorial(逃
还有,考虑一下用 stdin 代替 标准输入 这样的?

export 好像是保留到当前 session 结束
其他的要改 rc 貌似

《C++ Primer》和《C++ Primer Plus》有哪些区别? - 知乎


可能还是信息提取能力重要吧 相比界外的 so ,
界内 csdn 等虽然零散碎片化其他什么的很多倒也还能看…
有毒归有毒……


直接改源码这太宏内核了

3 个赞