无忧启动论坛

标题: cish 开发构想 [打印本页]

作者: 不点    时间: 2018-3-7 00:17
标题: cish 开发构想
本帖最后由 不点 于 2018-8-1 02:52 编辑

广告:长期招募开发者、合作者。粗略考虑,有以下条件:

1、招募略懂英文、但英文比较烂的人,写中英文文档;完成富有挑战性的任务,以期提升英文水平。
2、招募略懂 UNIX shell、但又一知半解的人,共同参与开发;通过富有挑战性的工作,提升 shell 知识水平。
3、招募略懂 C 语言而几乎完全不懂 C++ 语言的人,共同参与开发;通过富有挑战性的工作,提升 C++ 语言开发能力。












本主题带有 “博客”、“日志” 的性质,记录本人的探索思考过程,主要是为了方便自己将来能够追踪和回忆。

本项目 cish 只支持 Linux,不支持 BSD、Android 等其它 Unix(或类 Unix)平台。

不使用 Linux 者,以及对 Linux 不感兴趣者,请远离此处——远远地躲开,不要 “帮忙”,不要发言;实在憋不住、非要发言的话,也不要尽是说风凉话,不要指手划脚的,不要干扰此处的记述和讨论;更不要存心捣乱,请注意自己的形象,请自尊。您的每一句发言,都记录在案;不适当的发言,会毁了您自己的形象,待到将来您后悔了、想 “洗白”,都不那么容易了。请尊重您自己!我丝毫都不怕您讽刺我、骂我;但您恶心我的时候,同时也在恶心大家,属于捣乱的范畴,所以真心不欢迎您!请您不要攻击 VPS,您的攻击,已经表明您是老对手了,是从 grub4dos 时代就跟着我不断发动攻击的那个五毛。我确实损害了某些公司的利益,所以会引来攻击,这个我认了;也早有思想准备。但另一方面,攻击者也明显暴露了身份。您收手吧!您会无功而返!我饶不了您!我会慢慢地、慢慢地让大家都知道您是谁!您的攻击其实是在伤害您自己!您明白吗?嗯??请您不要假装成傻瓜问我 “攻击者是谁?”。您若真是毫不知情(就跟傻子一样),我懒得去答复您——我得费多少年才能跟您解释清楚?您若不是傻瓜,明知故问,那您就是攻击者,因而也不用回答您的问题了,是不是?在您提问之前,请反复确认,您该来这儿吗?这是您必须来的地方吗?如果不是,请远远地走开——远远地!远远地!

目前项目处于“Alpha 测试” 状态,即,“开发者内部测试”。有开发能力的人,可以参与开发和测试。非开发者、普通用户,不适合参与测试。




























自从几年前接触到 Ch 这个闭源的 shell 之后,我就在想,要是有个开源的版本该多好啊。Ch 是个 C 语言的解释器,同时也是一个 Unix shell。

后来接触到 Cling 这个开源的 C++ 解释器,然而遗憾的是,它不是 shell,而且它的开发者并不把 shell 当作一个开发目标。

纠结了很久,最终我意识到不能坐等了,必须主动出击,实现自己的想法。

前几天,我谈了自己的想法。wintoflash 给予超乎寻常的支持,提供了 VPS 空间,方便这个项目的开发。大家可以用 shell 来访问 VPS 空间,随时可以体验开发的效果。

现在想想,这种开发方式可能还很少见,具有某种 “开创性”,因而很 “刺激”。

为 cling 添加 shell 的功能特性之后,新的软件就准备叫做 cish。

cling 是逐行处理代码的,我们也顺其自然吧。但 C++ 代码与 shell 代码的风格(或语法)有矛盾和冲突,不容易兼容并蓄、两全其美。

(以下这段话作废,涂掉,请跳过)
于是采取如下的限制或取舍:

1、以 “#”、“;”(分号)、“!”(感叹号)开头的行,按照 C++ 语言来处理
2、以 “)”、“]”、“}” 开头的行,按照 C++ 语言来处理
3、以 “(”、数字(0~9)开头的行,按照 C++ 语言来处理
4、以 “(”、“[”、“{” 结尾的行,按照 C++ 语言来处理
5、以 “\”(反斜杠)、“,”(逗号)、“;”(分号)、“!”(感叹号)、“//”(双斜杠)结尾的行,按照 C++ 语言来处理

不符合上述条件的行,都当作 shell 命令来处理。


【更新】登录 VPS 的账户和口令如下

账户:public
口令:cish_public

Windows 下可以用浏览器直接访问 http://45.77.210.168/ (敲入用户名和口令即可看到 shell 提示符)。

Windows 下还可以先安装一个虚拟终端(PuTTY 或 colinux 之类的软件),然后在其 shell 提示符下用

ssh public@45.77.210.168

命令来登录 VPS(会提示您敲入 public 用户的口令)。

无论以哪种方式登入 VPS 之后,在 bash 提示符 $ 之下,敲入 ./cish 就进入 cish 的命令行,这就可以进行测试了。测试完毕,敲入 exit 可以退回到 bash 的提示符。再次敲入 exit 就登出(log out)了。

万一 cish 文件被攻击者删除了,请自行建立符号链接:

ln    -s    /home/user/inst/bin/cling    cish

顺便说,这个五毛真够 傻 B——这个软件处于开发者内部测试状态,来测试的人、感兴趣者,也基本上都是熟悉 Linux 的人。你用 rm -rf 删掉 public 用户的全部文件,就算你有能耐了吗?你的主子要是赏你五毛钱,这个主子也真掉价啊!你跟着这样的主子胡乱混日子有啥意思?还不如早早地拍屁股走人!你的攻击,没有多大点卵用,却暴露了你的主子在惦记着这里;你这等于是“通风报信”啊——提醒我不要放松警惕!所以你真是
傻 B 啊!说不定你的主子还要打你屁股呢!

在 colinux 下可以使用 scp 命令向服务器拷入文件(或从服务器拷出文件)。Windows 命令提示符下也可以用 pscp 命令进行拷贝(pscp 是 PuTTY 官网提供的一个命令行工具)。也可以下载具有图形界面的 WinScp 软件进行拷贝。注意:Windows 自带的 rcp 命令与 Linux 不兼容,无法进行拷贝。如果您有 Linux 系统,则可以使用 rcp 或 scp 命令进行拷贝。

src.diff.gz

27.51 KB, 下载次数: 1, 下载积分: 无忧币 -2

2018-06-24 制作的补丁,备份一下,以免丢失

src.diff.gz

26.83 KB, 下载次数: 0, 下载积分: 无忧币 -2

2018-06-16 制作的补丁,备份一下,以免丢失

tmp.tar.gz

21.38 KB, 下载次数: 0, 下载积分: 无忧币 -2

src.diff.gz

27.51 KB, 下载次数: 0, 下载积分: 无忧币 -2

2018-06-25 制作的补丁,备份一下,以免丢失


作者: l3429900    时间: 2018-3-7 08:49
大神威武,必须要学习一下,谢谢分享你的想法,如果可能,分享我的想法吧
作者: 不点    时间: 2018-3-7 10:13
谢谢各位,有你们支持,有你们作后盾,我就更敢做、更放得开了。
作者: 邪恶海盗    时间: 2018-3-7 13:10
看不懂,纯帮顶...
作者: lbw2007    时间: 2018-3-7 17:20
如果帮得上忙,一定会尽力而为!
作者: 易广白    时间: 2018-3-7 17:47
也不太懂但如果帮得上大大的忙,一定会尽力而为!
作者: gnuxwy    时间: 2018-3-7 18:51
嗯,工作进行中,大赞,保持关注,以后时间充足,水平提高了,也许可以好好学习下cish的源码。

作者: 不点    时间: 2018-3-7 18:57
最近在学习 POSIX shell 规范,虽然不可能遵守 POSIX 规范,但了解一下也有好处。

我们最常用的其实不是 “管道”、“输入输出重定向”、“作业控制” 之类的高级功能,而是 “通配符(文件名模糊查找)” 之类的简单功能。

VPS 上的代码,大家都能看得见。大家共同开发吧。说不定您有某种眼光、某种独到的视角、某种水平,而能让软件向前迈一大步。当初我开了个头做 grub4dos,还真是有点胆量。我现在知道,我技术水平实在很一般。也许是因为我敢于担当,才有了那个软件。后来参与开发的人、明里暗里提供帮助的人,那就太多了。要不是那些参与者,光凭我一个人,那是走不了多远的。




作者: 不点    时间: 2018-3-7 21:12
本帖最后由 不点 于 2018-3-9 13:28 编辑

关于 if 语句——

“真假” 值,shell 真是制造了麻烦。其实也不是 shell 开发者制造的麻烦,而是操作系统开发者制造的(不经意制造的):不出错时,返回 0,然而这是 “假” 啊!出错时,返回 “非 0”,然而这是 “真” 啊!

好的,承认 0 是真,1 是假。那么,这次轮到 C 语言开发者在制造麻烦了:刚好相反。

所以,真假是相对的,而不是绝对的。把其中一个定义为真,另一个就是假。

哲学是兜圈子,解决不了问题。我们遇到的现实问题是:

if (
        ls
) {
        ls
;}

本意是,当 ls 执行成功时,再执行一次 ls 命令。然而,实际却只执行了第一个 ls。这是因为,当 ls 执行成功时,返回值为 0,这在 C 语言看来,那就是 “假”,因此不去执行花括号里面的 ls 命令。

纠结啊!

顺便说,先别挑剔上述 if 语句难看。将来会让它紧凑一些(比如,可以在一行实现,而不是多行)。

shell 命令返回值是整数,我觉得还是维持这种 “不和谐” (与 C 语言的矛盾)吧。

【补充】slore 大人点评的方向是对的。要完成前面所说的任务,目前应该这样
if ( !
        ls
) {
        ls
;}

这里 if 的条件当中要有 “!” 来取反。这与通常 shell 当中的 IF 语句的情况就不同了。这是差别所在。

就是说,cish 与以前的 shell 是不同的,用 cish 编程时需要注意这些差别。

作者: 不点    时间: 2018-3-7 21:52
wintoflash 发表于 2018-3-7 21:33
代码要不要托管到GitHub上?
毕竟cling是LGPL协议的

没问题,可以这么做。不过,我有点懒,不想学新知识。以前为了开发 grub4dos,好不容易跟 bean 学会了 svn 命令。可后来项目空间被迫多次转移,现在也转移到 GITHUB 上了。然而我就是没有学会用 git 来操作代码库。我只会用 git 下载代码,不会上传和维护。如果让谁代劳的话,也很辛苦。让你代劳?我估计你没时间。别看让你出钱你愿意,你不一定拿得出时间。git 仓库有个好处,是能够记录和跟踪代码的变化。可惜我跟不上时代的步伐了。

对了,正好有个问题顺便请教你。github 上的 cling 这个软件,有 79 个 fork。你知道 fork 的目的是啥吗?fork 以后怎么用?fork 以后能改名字吗?能改代码吗?

作者: 不知    时间: 2018-3-7 22:07
不点 发表于 2018-3-7 21:52
没问题,可以这么做。不过,我有点懒,不想学新知识。以前为了开发 grub4dos,好不容易跟 bean 学会了 sv ...

fork跟复制差不多,把源代码放到了自己的账号上。fork过后就可以自己修改源代码了,也可以创建新分支。
作者: 不点    时间: 2018-3-7 22:10
不知 发表于 2018-3-7 22:07
fork跟复制差不多,把源代码放到了自己的账号上。fork过后就可以自己修改源代码了,也可以创建新分支。

如果原始的代码有变动的话,fork 后的代码是不是自动跟着变?
作者: 不知    时间: 2018-3-7 22:18
不点 发表于 2018-3-7 22:10
如果原始的代码有变动的话,fork 后的代码是不是自动跟着变?


默认应该不会,fork过后,一般是先把代码下下来(一般不在浏览器上修改),修改后再传上去。
————————————————————————————————————————————
https://www.jianshu.com/p/6c366b53ea41

https://www.cnblogs.com/patchouli/p/6511251.html
作者: 不点    时间: 2018-3-8 10:32
本帖最后由 不点 于 2018-3-8 20:43 编辑

震撼!

我搜 “c++ string to argv”,目的是让我的命令行处理能够 “偷懒” 一点——想找一个现成的方案。结果还真找到了:

convert string to argv in c++
https://stackoverflow.com/questions/1511797/convert-string-to-argv-in-c

问题的提出是 2009 年,总共有 9 个回复,最后一个回复是 2016 年 11 月 16 日。这最后一个回复太棒了!抄录如下:

May be it is too late to answer on this question but you could use standard POSIX functions glob or wordexp:

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

int
main(int argc, char **argv)
{
   wordexp_t p;
   char *exec_path = "/bin/ls";

   p.we_offs = 1;
   wordexp("-l -t /etc", &p, WRDE_DOOFFS);
   p.we_wordv[ 0 ] = exec_path;
   execv(exec_path, p.we_wordv);

   /* This code is unreachable */
   exit(EXIT_SUCCESS);
}

It would prepare 3 parameters: -l (long listing format), -t (sort by modification time) and directory /etc to list, and run /bin/ls. Call wordexp() gives you exactly the same result as call /bin/sh -c recomended previously but spawaned process would have parent process not /bin/sh.

我采纳 wordexp 的目的,仅仅是让它替我做 string to argv 的转换,以便用在 execvp 的参数上。然而出人意料的是,wordexp 做得更多,它能把 *.* 之类的扩展成文件名,也能处理 $(command) 或等价的反引号命令(`command`)。现在在 cish 下敲入

ls *.c
echo `ls`
echo $(ls)
echo $(( 5 + 8 ))

就能体验其强大之处了!而这都是 wordexp 函数完成的,我没有写任何实质性的处理代码。

我感叹幸亏我现在才着手干。如果提前两年,上面这个回帖还不存在,那就不知道会走多大的弯路了,做出来的效果肯定与现在不一样。



作者: 不点    时间: 2018-3-8 20:38
内部命令 exit 和 cd 已经实现。如果不太 “挑剔” 的话,这个 cish 凑合着已经可以 “工作” 了。
作者: 不点    时间: 2018-3-9 23:08
谢谢各位关心帮助。待我将来学会 git 的操作之后,再找托管空间。

我对于 cling 的改动,相比于 cling 本身庞大的身躯,是非常小的。因此,小打小闹即可。

这些小小的改动,容易维护,并不十分需要托管空间。



今天增加了出错处理,更健壮了。

作者: 不点    时间: 2018-3-10 10:53
本帖最后由 不点 于 2018-3-10 11:01 编辑
wintoflash 发表于 2018-3-10 09:11
wetty装好了。除了ssh和http之外的网络都屏蔽了。
现在可以网页打开 http://45.77.210.168/ 输入用户名 us ...


试验成功!棒极了!

尤其是,断网,保证了安全,竖起大拇指!

rcp 命令仍然可以拷贝本地文件到 VPS,够用了。

还剩下两件事需要完善:

1、开出更多虚拟内存,让 cling 编译不卡顿。

2、建立一个不同于 user 的账户,以便实行隔离,免得项目中的文件被人破坏。

也或者可以建立一个叫做 public 的账户,供大众使用。而把 user 账户留给开发者使用(如果这样的话,我只需更改 user 账户的密码即可阻止别人用 user 账户进入)。



作者: ygao2004    时间: 2018-3-10 11:14
不点 发表于 2018-3-9 23:08
谢谢各位关心帮助。待我将来学会 git 的操作之后,再找托管空间。

我对于 cling 的改动,相比于 cling  ...

git 和 svn 都支持的。


作者: 不点    时间: 2018-3-10 11:24
想不到!

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=404266

https://wintoflash.com/

https://wintoflash.com/home/zh/

https://wintoflash.com/overview/zh/

这里介绍的是 wintoflash 的公司吗?

作者: 不点    时间: 2018-3-10 11:28
ygao2004 发表于 2018-3-10 11:14
git 和 svn 都支持的。

有办法用 svn 来上传、提交、管理吗?如果只能用 svn 下载,那就等于不支持 svn。
作者: gnuxwy    时间: 2018-3-10 12:07
恭喜不点大师,新项目又有进展了啊,等公众号搞好了,也上去试玩下cish。

作者: 不点    时间: 2018-3-10 13:59
user 密码已改
作者: ygao2004    时间: 2018-3-10 17:00
不点 发表于 2018-3-10 11:28
有办法用 svn 来上传、提交、管理吗?如果只能用 svn 下载,那就等于不支持 svn。

http://git.mydoc.io/?t=154713

你说的刚好都支持。
作者: 不知    时间: 2018-3-10 18:01
报告一个错误:
printf()打印数字的问题。

作者: 不点    时间: 2018-3-10 20:16
不知 发表于 2018-3-10 18:01
报告一个错误:
printf()打印数字的问题。


这是已知的问题。cling 可能缓存了一行,直到碰上回车符才输出一行(也可能是 printf 自己缓存的,这我不懂)。我改动的部分,不涉及到这个问题。

我不太清楚,是否在调用 refresh 或者 fflush 之类的函数之后,会有不同的结果。你可以在百度搜搜看。


作者: gnuxwy    时间: 2018-3-10 22:01
刚才用公众号登录去瞧了下。嗯,网页登录tty,确实很方便使用。

看到最初的提示,提点小意见:
User logged:5
Notice:
1.To use cish,please type cish,you can also add parametors.To view the cish sources,please type cd $src
2.To clean the information on the screen,please type clear.
标点符号后带点空格吧,这样相邻句看起来自然点,要不然给人感觉挤挤的。

试了两个shell命令,ls cd  竟然第二个命令的输出氏一大堆0x
#0 0x000055a7d6e3b8fa llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/home/user/inst/bin/cling+0xaa78fa)
#1 0x000055a7d6e39786 llvm::sys::RunSignalHandlers() (/home/user/inst/bin/cling+0xaa5786)
#2 0x000055a7d6e398cc SignalHandler(int) (/home/user/inst/bin/cling+0xaa58cc)
#3 0x00007fc56ae15140 (/lib/x86_64-linux-gnu/libc.so.6+0x37140)
#4 0x000055a7d6de9c24 shellInterpreter(char const*) (/home/user/inst/bin/cling+0xa55c24)
#5 0x000055a7d6dea9de cling::MetaProcessor::process(llvm::StringRef, cling::Interpreter::CompilationResult&,
cling::Value*, bool) (/home/user/inst/bin/cling+0xa569de)
#6 0x000055a7d6e664cb cling::UserInterface::runInteractively(bool) (/home/user/inst/bin/cling+0xad24cb)
#7 0x000055a7d6c99a8b main (/home/user/inst/bin/cling+0x905a8b)
#8 0x00007fc56adff1c1 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x211c1)
#9 0x000055a7d6d0cc3a _start (/home/user/inst/bin/cling+0x978c3a)
Stack dump:
0.      Program arguments: /home/user/inst/bin/cling
Segmentation fault (core dumped)

public@ttyd:~$

照bash的命令反馈,若cish不氏目录,应该直接告知用户 cish 不氏目录就行了。不能搞出一大堆0x出来。


作者: 不点    时间: 2018-3-10 22:12
gnuxwy 发表于 2018-3-10 22:01
刚才用公众号登录去瞧了下。嗯,网页登录tty,确实很方便使用。

看到最初的提示,提点小意见:

cd 命令有 bug,会尽快修复。


作者: 不点    时间: 2018-3-10 22:48
gnuxwy 发表于 2018-3-10 22:01
刚才用公众号登录去瞧了下。嗯,网页登录tty,确实很方便使用。

看到最初的提示,提点小意见:

bug 已修复,请检查。
作者: 不点    时间: 2018-3-11 03:22
wintoflash 发表于 2018-3-10 12:37
public帐户密码:cish_public
加了1GB的swap

增加 swap 之后,重新从头编译,经过 4 个小时,顺利完成,没有卡顿。

作者: 不知    时间: 2018-3-11 10:20
不点 发表于 2018-3-10 20:16
这是已知的问题。cling 可能缓存了一行,直到碰上回车符才输出一行(也可能是 printf 自己缓存的,这我 ...

确实需要flush。不过直接编写程序是不需要的。
——————————————————————————————————
cish:

________________________________________________________
gcc:

作者: 不点    时间: 2018-3-11 10:51
本帖最后由 不点 于 2018-3-11 23:09 编辑
不知 发表于 2018-3-11 10:20
确实需要flush。不过直接编写程序是不需要的。

受到你的启发,对于 cout,我也找到了一个办法。

如果先执行一条

cout << unitbuf;

那么,后续的 cout 就会即时打印。

如果执行一条

cout << nounitbuf;

那么后续的 cout 就会按行缓存,遇到回车才开始输出一行。

对于 printf,我还没找到对策。【更新】找到了,非常棒:

https://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-the-call-unless-a-newline-is-in-the-format-strin


The stdout stream is buffered, so will only display what's in the buffer after it reaches a newline (or when it's told to). You have a few options to print immediately:

Print to stderr instead using fprintf:

fprintf(stderr, "I will be printed immediately");

Flush stdout whenever you need it to using fflush:

printf("Buffered, will be flushed");
fflush(stdout); // Will now print everything in the stdout buffer

Edit: From Andy Ross's comment below, you can also disable buffering on stdout by using setbuf:

setbuf(stdout, NULL);

就是说,先执行一条 setbuf(stdout, NULL); 就 OK 了。

【补充】但是当使用了 setbuf(stdout, NULL); 之后,我不知道如何恢复为以前的状态(即,缓冲输出的状态)。所以,我感觉还是

printf(...); fflush(stdout);

的方法比较好。这可以写成一个函数(也可以写成一个宏),让它自动 flush。只要不使用 fflush 函数,就仍然是缓冲输出的状态了。


作者: 不知    时间: 2018-3-11 14:52
不点 发表于 2018-3-11 10:51
受到你的启发,对于 cout,我也找到了一个办法。

如果先执行一条

虽然没法直接恢复,但可以用setvbuf设置缓冲(模式:行缓冲,无缓冲,满缓冲)。
——————————————————————————————————————————


作者: 不点    时间: 2018-3-11 16:54
不知 发表于 2018-3-11 14:52
虽然没法直接恢复,但可以用setvbuf设置缓冲(模式:行缓冲,无缓冲,满缓冲)。
—————————— ...

不错,又深入了一步。要是能够 get  出 stdout 原有的 buffer,那该多好啊?
作者: gnuxwy    时间: 2018-3-11 17:52
嗯,用公众号登进去又测试了下,这样试了更多的命令,看起来还不错。各反馈如下:
看不合法的提示,应当氏 管道符 和 重定向符不支持的啦。不过确实氏个能用的shell了。

[cling]$ mv ttt1.uxt ttt3.uxt
[cling]$ cat ttt* > ttt03.uxt
this ttt3.uxt file
wordexp: Illegal occurrence of newline or one of |, &, ;, <, >, (, ), {, }.
err=2, cmd=cat ttt* > ttt03.uxt
input_line_12:2:2: error: unknown type name 'cat'
cat ttt* > ttt03.uxt
^
input_line_12:2:9: error: expected ';' at end of declaration
cat ttt* > ttt03.uxt

[cling]$ cat ttt ttt3.uxt > ttt03.uxt
wordexp: Illegal occurrence of newline or one of |, &, ;, <, >, (, ), {, }.
err=2, cmd=cat ttt ttt3.uxt > ttt03.uxt
input_line_13:2:2: error: unknown type name 'cat'
cat ttt ttt3.uxt > ttt03.uxt
^
input_line_13:2:9: error: expected ';' at end of declaration
cat ttt ttt3.uxt > ttt03.uxt
        ^
        ;
[cling]$ vi ttt
[cling]$ vi ttt
[cling]$ vi ttt03.uxt
[cling]$ pwd
/home/public
[cling]$ free
              total        used        free      shared  buff/cache   available
Mem:        1009308      134908       67924       10232      806476      676368
Swap:       1048572      168704      879868
[cling]$ date
Sun Mar 11 09:37:10 UTC 2018
[cling]$ grep "test" ttt
this a test line.

for test cish.
[cling]$ tail ttt03.uxt
this ttt3.uxt file
for test cish de shell cmd.

[cling]$
[cling]$ q
Command not found: q
input_line_14:2:2: error: use of undeclared identifier 'q'
q
^
[cling]$ quit
Command not found: quit
input_line_15:2:2: error: use of undeclared identifier 'quit'
quit
[cling]$ exit
public@ttyd:~$
logout
作者: 不点    时间: 2018-3-11 18:08
本帖最后由 不点 于 2018-3-12 08:14 编辑
gnuxwy 发表于 2018-3-11 17:52
嗯,用公众号登进去又测试了下,这样试了更多的命令,看起来还不错。各反馈如下:
看不合法的提示,应当氏 ...


没错,以下这些内容还没支持:

1、命令以及参数的自动补全。
2、管道
3、输入输出重定向
4、信号处理
5、后台执行命令,以及作业控制(job control)等


作者: 窄口牛    时间: 2018-3-11 22:53
看不懂,纯掺和。
作者: gnuxwy    时间: 2018-3-12 20:30
不用急,大师慢慢完善cish就行。。。以后更成熟了,就可以成为cling一个有趣的分支版。

作者: 不点    时间: 2018-3-13 04:15
本帖最后由 不点 于 2018-3-13 16:07 编辑
gnuxwy 发表于 2018-3-12 20:30
不用急,大师慢慢完善cish就行。。。以后更成熟了,就可以成为cling一个有趣的分支版。


是的,急不来的。时间越久,就越能锤炼出好东西。每个人在不同的时期,会有不同的思路。随着时间的推移,每个人都在进步,外界环境也在变化,说不定当初以为很难做的事情,到那时,水到渠成,不难了。

一方面要能沉得住气,等到技术成熟再下手,不要匆忙。另一方面,对于感兴趣的各位大人来说,一旦在某方面已经考虑成熟,拖延不是一个选项,该出手时就出手。这软件不是我的,而是大家的。大家共同开发,进步才会快。该出手时不出手,让时光白白流逝,将来会后悔的。


作者: 不点    时间: 2018-3-13 05:59
记录一下,Windows 下的 rcp 是无用的(把我折腾得够呛),根本与 Linux 不兼容。最后终于找到了 pscp 这个工具,可以在 Windows 和 Linux 之间传输文件,其功能相当于 linux 的 rcp 命令,用法也与 linux 的 rcp 相同(或类似)。

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

上面是 putty 的官方下载页,只需下载 pscp 即可,无需下载 putty。


作者: 不点    时间: 2018-3-13 11:15
记录一下(方便以后找到这个资料),目前在学习《Shell Command Language》
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html


作者: 不点    时间: 2018-3-13 13:23
今天又改动了一点点。以数字( 0~9 )或左括号( “(” ) 开头的行,都作为 C 代码来处理。这样方便用 C 语言的功能来在命令行下进行计算。shell 本身也能计算,但是需要像这样

expr  3 + 5
expr  2 \* 7
echo  $(( 5 * 9 ))

比较累赘。而用 cish 的命令行,直接敲入 5*7 回车,得到 (int) 35,这就快捷多了。

作者: 不点    时间: 2018-3-13 17:42
在 shell 规范中,shell 也有函数。我在考虑,最好是能把 shell 的函数与 C 的函数进行某种整合,统一处理。
作者: gnuxwy    时间: 2018-3-14 22:44
嗯,老大应该在本贴的首楼中,直接贴上网址,公用帐号,密码,方便有兴趣的坛友点进来就能进去瞧瞧。

屮目前编程水平未入门,最近几年如果有时间,也会专注于弄个自已能用的输入法,毕竟一直没有自已用
得爽的输服台,心里总氏不舒服,不管时间多长,反正有生之年一定要搞定它。等搞定这个问题之后,如果
水平提高了,或许会参与其他的开源项目。

目前嘛,只能氏闲逛其他gnux网站,论坛,贴吧时顺便帮老大宣传一下啦。。。


作者: 不点    时间: 2018-3-15 08:41
今天了解了 cling 的输出重定向。为了让 cling 不显示出错信息,找了很久,都没找到办法。用重定向的方法,算是权宜之计。

输入
  1. .2> /dev/null
复制代码


后续的出错信息都看不见了。

再输入
  1. .2>
复制代码


(文件名的位置是空的,即,不填文件名,其作用是撤销前面的重定向),则后续的出错信息就又能显示出来了。

作者: 不点    时间: 2018-3-16 10:28
本帖最后由 不点 于 2018-3-20 15:26 编辑

正如以前所说的,整合就需要权衡。经过一段时间的实践和认识,现在我又回到 “以 C 为重心” 的思路上了。

昨天找到了屏蔽 Cling 出错信息的办法。这不彻底。彻底的办法应该是把出错信息保存起来,当需要的时候,让它显现;当不需要的时候,让它隐藏。但出错信息不可以保存在磁盘文件上(影响执行效率,也影响磁盘寿命),应该保存在内存中。

如果找到这样的办法,就可以首先用 C 解释,当出现语法错误时,再按 shell 命令来解释。

当涉及到 “编程” 这个话题的时候,还得依靠 C,不能依靠 shell。

shell 主要只是用来运行命令罢了。




为什么要先用 C 解释呢?因为处理逻辑简单。C 解释时,出现语法错误的,都可以当作 Shell 来解释,不啰嗦。如果先用 shell 解释,为了不把 C 代码当成 shell 来解释,就需要用排除法,排除很多具有 C 特征的行,而且尽管排除了很多,也难以全面彻底地排除。




当敲入 ls 之类的 shell 命令时,由于 Cling 把它当成 C 语言代码来处理,因此 Cling 会报错。要想屏蔽出错信息,可以注释掉

src/tools/clang/lib/Sema/SemaExpr.cpp

中如下一行(这是通过艰苦调试发现的!)

  Diag(R.getNameLoc(), diagnostic) << Name;

但若想把出错信息保存在某个字符串中,则相当不容易,因为 C++ 比 C 复杂得多,光是找 Diag () 的定义,我都搞不定。【后来通过把 cerr 重定向到 stringstream 中巧妙解决了这个问题。】

作者: slore    时间: 2018-3-16 19:30
不点 发表于 2018-3-16 10:28
正如以前所说的,整合就需要权衡。经过一段时间的实践和认识,现在我又回到 “以 C 为重心” 的思路上了。
...

有个tinycc,很小的C语言编译解释器,你把解析的部分拿出来,
先用解析器跑下输入的代码,能过就当C,不能就当shell。
你通过个别字符的方式,简单语句还行,复杂些会出问题。

玩耍到研究方向的话,
引入神经网络,给他shell和C的代码训练识别度,
很快就可以到一个满意的识别度,不过编程语言这种特别规范的,不太需要,
还是标准解析过一遍实在。
作者: 不点    时间: 2018-3-16 23:23
slore 发表于 2018-3-16 19:30
有个tinycc,很小的C语言编译解释器,你把解析的部分拿出来,
先用解析器跑下输入的代码,能过就当C,不 ...

不错的思路。我其实挺喜欢小的东西。假如 cling 啃不动的话,可能我就会采用 tinycc 之类的小工具了。

希望有人去做 tinycc 的工作。

作者: 不点    时间: 2018-3-18 04:57
本帖最后由 不点 于 2018-3-20 15:59 编辑

现在已经调整为优先用 C 解释。当用 C 解释失败时,再用 shell 命令来解释。

在命令行敲入 M_PIM_PIl
(右边是小写的 L 表示双精度,不是数字 1回车,可打印出圆周率 π 的值。
在命令行敲入 M_EM_El (右边是小写的 L 表示双精度,不是数字 1)回车,可打印出自然对数的底 e 的值。

以上常数是在 math.h 中定义的,可以用来进行数值计算。优先用 C 解释的好处是,宏定义以及全局常量、全局变量、全局函数,都能直接使用。

敲入 chdir obj 回车,会进入 obj 子目录中。以下是处理过程:


  1. [cling]% chdir obj
  2. input_line_15:2:7: error: expected ';' after expression
  3. chdir obj                  由于先用 C 解释,所以会报错。
  4.       ^
  5.       ;
  6. input_line_15:2:8: error: use of undeclared identifier 'obj'
  7. chdir obj
  8.        ^
  9. input_line_16:2:8: error: use of undeclared identifier 'obj'
  10. chdir(obj)  失败后,进行第 2 次尝试,这次加上括号。但仍然失败。
  11.        ^
  12. (int) 0  最后为什么成功了呢?因为进行了第三次尝试:为参数加上了引号 chdir("obj") 当然就成功了。注意 chdir 是 C 的库函数(或者是系统调用)。下面的 pwd 命令能够验证确实进入 obj 子目录了。
  13. [cling]% pwd
  14. input_line_19:2:2: error: use of undeclared identifier 'pwd'
  15. pwd                同样地,先用 C 解释 pwd 是失败的。
  16. ^
  17. input_line_20:2:2: error: use of undeclared identifier 'pwd'
  18. pwd()              自动加上括号,当作函数调用,再试一次。但仍然失败。
  19. ^
  20. input_line_21:2:2: error: use of undeclared identifier 'pwd'
  21. pwd(0)         第三次尝试,加上参数 0。仍然失败。
  22. ^
  23. input_line_22:2:2: error: use of undeclared identifier 'pwd'
  24. pwd("")        第四次尝试,参数换成空字符串。仍然失败。
  25. ^
  26. /home/user/obj  最后为什么成功了呢?因为是交给 shell 模块执行了。这条信息是外部命令 pwd 打印出来的。
  27. [cling]%
复制代码

作者: 不点    时间: 2018-3-18 05:10
再举一例,用 cd obj 来进入 obj 目录:

  1. [cling]$ cd obj
  2. input_line_11:2:2: error: unknown type name 'cd'
  3. cd obj              先用 C 来解释,当然是失败的。
  4. ^
  5. input_line_12:2:5: error: use of undeclared identifier 'obj'
  6. cd(obj)       自动加上括号,进行第二次尝试,结果仍然失败。
  7.     ^
  8. input_line_13:2:2: error: use of undeclared identifier 'cd'
  9. cd("obj")     自动加上引号,进行第三次尝试,结果仍然失败(因为不存在 cd 这个函数)。
  10. ^
  11. 然而,下面的 pwd 命令却证实,cd obj 执行成功了。为什么呢?因为自动进行了第四次尝试,即 交给 shell 处理模块来执行。由于 shell 模块当中有个内部命令叫做 cd,所以就执行成功了。
  12. [cling]% pwd
  13. input_line_14:2:2: error: use of undeclared identifier 'pwd'
  14. pwd
  15. ^
  16. input_line_15:2:2: error: use of undeclared identifier 'pwd'
  17. pwd()
  18. ^
  19. input_line_16:2:2: error: use of undeclared identifier 'pwd'
  20. pwd(0)
  21. ^
  22. input_line_17:2:2: error: use of undeclared identifier 'pwd'
  23. pwd("")
  24. ^
  25. /home/user/obj
  26. [cling]%
复制代码

作者: 不点    时间: 2018-3-18 05:28
再举一例,用 exit 退出 cish 环境:

  1. [cling]% exit
  2. (void (*)(int) __attribute__((noreturn)) throw()) Function @0x7f7d38e25f00
  3. 看到没有?先用 C 解释,就成功了!因为 exit 确实是个系统调用,是个已经定义了的函数,它的地址被打印出来了。

  4. 由于已经发现它是函数,因此,进行第二次计算,这次加上括号:

  5. input_line_20:2:2: error: no matching function for call to 'exit'
  6. exit()      但不幸的是,失败了,因为 exit 要求有一个参数。
  7. ^~~~
  8. /usr/include/stdlib.h:499:13: note: candidate function not viable: requires single argument '__status', but no arguments were provided
  9. extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
  10.             ^
  11. user@ttyd:~$ 然而,看到没有?shell 提示符显示出来了!这说明已经成功退出 cish 了!为什么呢?因为自动进行了第三次尝试,加上参数 0,变成这样:exit(0) ——这当然能执行成功了,因为它是合法的 C 语句。这个语句执行完毕,当然就退出 cish 而回到 bash 的提示符了。
复制代码

作者: 不点    时间: 2018-3-18 05:52
刚才只用 C 语言的 exit 函数,就退出了。那么,我们先前写好的 shell 内部命令 exit 就没有机会获得执行了。下面用 “歪门邪道”来执行内部命令 exit,即,在 exit 后面添加一个参数 #,即,非法参数。碰巧我们的内部命令能够容忍这个非法参数,因此,可以成功执行。


  1. [cling]$ exit #
  2. input_line_11:2:6: error: expected ';' after expression
  3. exit #           先用 C 解释,当然会失败。
  4.      ^
  5.      ;
  6. input_line_11:2:7: error: expected expression
  7. exit #
  8.       ^
  9. input_line_12:2:7: error: expected expression
  10. exit(#)          自动进行第二次尝试,加上括号,仍然失败。
  11.       ^
  12. input_line_13:2:2: error: no matching function for call to 'exit'
  13. exit("#")     自动进行第三次尝试,为参数加上引号,仍旧失败。
  14. ^~~~
  15. /usr/include/stdlib.h:499:13: note: candidate function not viable: no known conversion from 'const char [2]' to 'int' for 1st argument
  16. extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
  17.             ^
  18. user@ttyd:~$
复制代码

看到 bash 提示符,知道是成功了。为什么能成功呢?因为自动进行了第四次尝试,交给 shell 模块来执行了。我们先前写的那个 shell 内部命令 exit 可以接受一个非法参数。这样就成功退回到 bash 了。

作者: 不点    时间: 2018-3-18 12:02
本帖最后由 不点 于 2018-3-18 14:11 编辑

发现 Cling 的一个 bug:除以零时崩溃(core dumped)。

1/0 会正常报错,0/0 也会正常报错。这是因为编译器在编译阶段都能够发现分母为零,所以能够报错,不至于崩溃。

然而,

int k=0
0/k

这就崩溃了。说明 Cling 在运行时有 bug。

如果改成
0.0/k
1.0/k
1/(k+0.0)
都不会崩溃。这说明浮点计算很健壮,而整数计算不太完善。




----更新----

证明是 C 库函数有 bug,不是 Cling 的责任。

以下是 test.c 的内容,用 gcc test.c 或 g++ test.c 来编译,执行 ./a.out 它能成功打印出 OK!

但是,如果把浮点数 0.0 变成整数 0,则不能打印出 OK,而是显示 “浮点数异常”,程序崩溃了。

另外,崩溃时,它显示的信息也不准确。不应该显示 “浮点数异常”,而应该显示 “整数除以零错误”,或 “整数除法异常”。

这证明了问题的根源是库函数。



  1. #include <stdio.h>

  2. int
  3. main ()
  4. {
  5.         int k=0;

  6.         k = (k+0.0) / k;

  7.         printf ("OK!\n");
  8.         return 0;
  9. }
复制代码



作者: gnuxwy    时间: 2018-3-18 23:11
噢,又来瞧大师的工作了。。。很有趣。。。嗯,还氏先进行C解释,发现行不通再改为shell执行。

另,楼上大师说的那个除零问题报错,很可能的原因氏数据类型转换有关。
因为编译发x.y这样的形式,估计氏当作浮点数对待的。有可能0.0实际上变成了最小的浮点常量。

这样浮数和整数一齐做加法运算时,统统转为浮点。最后做除法,结果就报浮点出错啦。。。

作者: 不点    时间: 2018-3-19 23:12
本帖最后由 不点 于 2018-3-20 13:51 编辑

记录一下。搜 “redirect stderr to stream c++” 找到:
https://stackoverflow.com/questions/5419356/redirect-stdout-stderr-to-a-string/24796475




庆祝一下。上述网页真棒!搞定了!把出错信息重定向到 stringstream 中,竟然如此简单!

cish 又上新台阶,这次真正调整过来了,即先按 C 解释,最后用 shell 解释。如果 shell 命令执行成功,则不显示出错信息。如果 shell 命令执行失败,则先显示 shell 出错信息,再显示 C 语言出错信息。

不过,目前在复合语句(if,switch,for,while 等结构)中暂不支持 shell 命令。目前只在 “简单语句(单行语句)” 的情况下才可以使用 shell 命令。




作者: 不点    时间: 2018-3-21 17:21
本帖最后由 不点 于 2018-3-22 05:14 编辑

今天又改进了一点点,增加了一个功能,类似于别名。

用户自己首先建立如下函数(目前可以用键盘逐行敲入):


  1. int ll ( int argc, char **argv) {
  2.     system ("ls -l");
  3.     return 0;
  4. }
复制代码


然后,再敲入 ll 回车,就会执行 ls -l 命令。这只是一个演示,这个演示还没有用到 ll 的命令行参数 argcargv

下面是个带命令行参数的演示。这个函数 echo 能够打印出命令行参数:


  1. int echo (int argc, char **argv) {
  2.     for (int i=1; i<argc; i++) {
  3.         fputs(argv[i], stdout);
  4.         fputs(" ", stdout);
  5.     }
  6.     fputs("\n", stdout);
  7.     return 0;
  8. }
复制代码


运行效果:

  1. [cling]% int echo (int argc, char **argv) { for (int i=1; i<argc;i++){fputs(argv[i], stdout);fputs(" ", stdout);} fputs("\n", stdout);return 0;}
  2. [cling]% echo hjj    hjghjhjg    hjjgjghg
  3. hjj hjghjhjg hjjgjghg
  4. [cling]% echo
  5. [cling]% echo "hghghg  hjhjhj        hjhjhjhj"
  6. hghghg  hjhjhj        hjhjhjhj
  7. [cling]%
复制代码


这就有 echo 命令了。此时执行的是 echo 函数,而不是外部的 echo 命令。
要想执行外部命令 echo,可以敲入路径 /bin/echo 来执行。

一般来说,敲入一个不带路径的命令,则首先当作函数来运行。如果失败,则当作内部命令。如果仍然失败,最后才查找外部命令。



作者: 不点    时间: 2018-3-22 17:19
本帖最后由 不点 于 2018-3-23 10:15 编辑

建立如下函数 ll,相当于建立 bash 的别名: alias ll="ls -alF --color=auto"

  1. int ll (int argc, char **argv) {
  2.         pid_t cpid, w;
  3.         int status = 0;
  4.         char * v[argc + 3]; /* end with NULL */
  5.         v[0] = (char *)"ls";
  6.         v[1] = (char *)"-alF";
  7.         v[2] = (char *)"--color=auto";
  8.         for (int i = 1; i < argc; i++) {
  9.                 v[i + 2] = argv[i];
  10.         }
  11.         v[argc + 2] = (char *) NULL; /* ending NULL */
  12.         cpid = fork();
  13.         if (cpid == 0) { // code executed by child
  14.                 execvp (v[0], v);
  15.                 perror ("execvp");
  16.                 printf ("Command not found: %s\n", v[0]);
  17.                 exit (-1); // exit child
  18.         }
  19.         // code executed by parent
  20.         if (cpid == -1) {
  21.                 perror ("fork");
  22.                 return 1;//exit (EXIT_FAILURE);
  23.         }
  24.         w = waitpid (cpid, &status, 0);
  25.         if (w == -1) {
  26.                 perror ("waitpid");
  27.                 return 1;//exit (EXIT_FAILURE);
  28.         }
  29.         return status;
  30. }
复制代码


把上述代码放在 $HOME/.cishrc 里面,就可以在每次启动 cish 后自动执行了。

作者: jianliulin    时间: 2018-3-22 17:30
是个shell可以替换linux默认的shell吗?
作者: 不点    时间: 2018-3-22 18:51
jianliulin 发表于 2018-3-22 17:30
是个shell可以替换linux默认的shell吗?

目前不能替换。自己试着玩可以。
作者: 不点    时间: 2018-3-23 11:27
目前我把主要精力用在真正需要的开发工作中,而不是分散一部分精力去做外围的项目管理工作。

等以后有了参与者、合伙人的时候,再考虑项目管理的问题。

说不定这个管理的工作,都不一定由我出面了。一切皆有可能。

比如说,有人建立 Web 主页,有人购买域名,有人负责写文档,有人负责代码优化整理,…… 那就真正活跃起来了。

目前只是个开头,也不需要考虑那么多的事情。

作者: 不点    时间: 2018-3-23 15:38
做如下试验,定义 main 函数。执行时,崩溃了。原因可能是结尾缺少了 return 0;
  1. [cling]% int main () { printf("this is my main\n");}
  2. [cling]% main
  3. #0 0x000055eee06b4a4a (�8���U+0xa22a4a)
  4. #1 0x000055eee06b28d6 (�8���U+0xa208d6)
  5. #2 0x000055eee06b2a1c (�8���U+0xa20a1c)
  6. #3 0x00007fee99b52140 (/lib/x86_64-linux-gnu/libc.so.6+0x37140)
  7. #4 0x00007fee99c99f70 (/lib/x86_64-linux-gnu/libc.so.6+0x17ef70)
  8. #5 0x000055eee1263b51 (�8���U+0x15d1b51)
  9. #6 0x000055eee126b1f3 (�8���U+0x15d91f3)
  10. #7 0x000055eee062288e (�8���U+0x99088e)
  11. #8 0x000055eee061ae1a (�8���U+0x988e1a)
  12. #9 0x000055eee05016ef (�8���U+0x86f6ef)
  13. #10 0x00007fee9af45031
  14. #11 0x000055eee0619337 (�8���U+0x987337)
  15. #12 0x000055eee0619789 (�8���U+0x987789)
  16. #13 0x000055eee0619f67 (�8���U+0x987f67)
  17. #14 0x000055eee0664375 (�8���U+0x9d2375)
  18. #15 0x000055eee06df2bb (�8���U+0xa4d2bb)
  19. #16 0x000055eee0501d41 (�8���U+0x86fd41)
  20. #17 0x00007fee99b3c1c1 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x211c1)
  21. #18 0x000055eee0574eda (�8���U+0x8e2eda)
  22. Stack dump:
  23. 0.      Program arguments: /home/user/inst/bin/cling
  24. 1.      Program arguments: �8���U Segmentation fault (core dumped)
  25. user@ttyd:~$
复制代码


添上 return 0; 依旧崩溃(猜测可能是因为 main 的参数不对):

  1. user@ttyd:~$ cish
  2. [cling]$ int main () { printf("this is my main\n"); return 0;}
  3. [cling]% main
  4. #0 0x000055b4a5d25a4a (�H6��U+0xa22a4a)
  5. #1 0x000055b4a5d238d6 (�H6��U+0xa208d6)
  6. #2 0x000055b4a5d23a1c (�H6��U+0xa20a1c)
  7. #3 0x00007f4161dcd140 (/lib/x86_64-linux-gnu/libc.so.6+0x37140)
  8. #4 0x00007f4161f14f70 (/lib/x86_64-linux-gnu/libc.so.6+0x17ef70)
  9. #5 0x000055b4a68d4b51 (�H6��U+0x15d1b51)
  10. #6 0x000055b4a68dc1f3 (�H6��U+0x15d91f3)
  11. #7 0x000055b4a5c9388e (�H6��U+0x99088e)
  12. #8 0x000055b4a5c8be1a (�H6��U+0x988e1a)
  13. #9 0x000055b4a5b726ef (�H6��U+0x86f6ef)
  14. #10 0x00007f41631c0031
  15. #11 0x000055b4a5c8a337 (�H6��U+0x987337)
  16. #12 0x000055b4a5c8a789 (�H6��U+0x987789)
  17. #13 0x000055b4a5c8af67 (�H6��U+0x987f67)
  18. #14 0x000055b4a5cd5375 (�H6��U+0x9d2375)
  19. #15 0x000055b4a5d502bb (�H6��U+0xa4d2bb)
  20. #16 0x000055b4a5b72d41 (�H6��U+0x86fd41)
  21. #17 0x00007f4161db71c1 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x211c1)
  22. #18 0x000055b4a5be5eda (�H6��U+0x8e2eda)
  23. Stack dump:
  24. 0.      Program arguments: /home/user/inst/bin/cling
  25. 1.      Program arguments: �H6��U Segmentation fault (core dumped)
  26. user@ttyd:~$
复制代码


看下面的试验结果。参数加上了,这次不崩溃了。然而没有打印出 “this is my main”,这是为什么?
看到 main 执行后,下一行显示的提示符是 $ 而不是 %,这说明是执行了 cish 自身的 main 函数,因此它打印出它所认为的第一个提示符,即 $。接着执行 exit,希望退出内层的 main 子进程,结果,它直接退回到 bash 了。为什么?
因为执行 main 函数时,并未 fork 出一个子进程,而只不过是 call 了 main 函数罢了(仍然处于当前进程之中)。exit 命令当然就退出了目前的 cish 进程而返回到 bash。


  1. user@ttyd:~$ cish
  2. [cling]$ int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  3. [cling]% main
  4. [cling]$ exit
  5. user@ttyd:~$
复制代码


看下面的试验结果。这次不定义 main 了,而是用 extern 声明 main 是已有的函数。执行结果也是成功的,与上述说法是一致的。

  1. user@ttyd:~$ cish
  2. [cling]$ extern int main (int, char **);
  3. [cling]% main
  4. [cling]$ exit
  5. user@ttyd:~$
复制代码


好的,这次 extern 和 定义同时使用,结果也一样。

  1. user@ttyd:~$ cish
  2. [cling]$ extern int main (int, char **);
  3. [cling]% int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  4. [cling]% main
  5. [cling]$ exit
  6. user@ttyd:~$
复制代码


下面的试验——当两次定义 main 的时候,报错了。

  1. user@ttyd:~$ cish
  2. [cling]$ extern int main (int, char **);
  3. [cling]% int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  4. [cling]% int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  5. input_line_18:1:5: error: redefinition of 'main'
  6. int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  7.     ^
  8. input_line_17:1:5: note: previous definition is here
  9. int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  10.     ^
  11. [cling]% main
  12. [cling]$ exit
  13. user@ttyd:~$ cish
  14. [cling]$ int main (int, char **);
  15. [cling]% int main (int, char **);
  16. [cling]% int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  17. [cling]% int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  18. input_line_19:1:5: error: redefinition of 'main'
  19. int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  20.     ^
  21. input_line_18:1:5: note: previous definition is here
  22. int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  23.     ^
  24. [cling]% main
  25. [cling]$ exit
  26. user@ttyd:~$
复制代码


总结一下,内部的 main 函数早已存在,虽然再定义一个新的 main 函数也不报错,但这个后来者并未被承认。
作者: 不点    时间: 2018-3-23 15:55
继续试验。在 main 之前加上分号 “;”,能够打印出 main 函数的地址。再定义一个 ttt 函数,让它的地址等于同一地址,结果,试验成功,ttt 的运行结果与 main 相同。
  1. user@ttyd:~$ cish
  2. [cling]$ extern int main (int, char **);
  3. [cling]% ;main
  4. (int (*)(int, char **)) Function @0x555cce819650
  5. [cling]% (int(*)(int,char**))0x555cce819650
  6. (int (*)(int, char **)) Function @0x555cce819650
  7. [cling]% int(*ttt)(int,char**);
  8. [cling]% ttt=(int(*)(int,char**))0x555cce819650
  9. (int (*)(int, char **)) Function @0x555cce819650
  10. [cling]% ttt
  11. [cling]$ exit
  12. user@ttyd:~$
复制代码


作者: 不点    时间: 2018-3-23 16:05
在下面的试验中,虽然我们定义了 main,但 “;main” 仍旧显示出未定义前的值,而不是新的值。执行结果也说明了这一点。
  1. user@ttyd:~$ cish
  2. [cling]$ extern int main (int, char **);
  3. [cling]% ;main
  4. (int (*)(int, char **)) Function @0x561169f76650
  5. [cling]% int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  6. [cling]% ;main
  7. (int (*)(int, char **)) Function @0x561169f76650
  8.   at input_line_19:1:
  9. int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  10. [cling]% main
  11. [cling]$ exit
  12. user@ttyd:~$
复制代码

作者: 不点    时间: 2018-3-23 16:34
在下面这个试验中,不使用 extern,而使用自定义的 main,结果,还是无法访问到新的 main,而总是获得原有的 main。试验结果证实了这一点。
  1. user@ttyd:~$ cish
  2. [cling]$ int main (int argc, char **argv) { printf("this is my main\n"); return 0;}
  3. [cling]% ;main
  4. (int (*)(int, char **)) Function @0x562cc212b650
  5. [cling]% int(*ttt)(int,char**);
  6. [cling]% ttt=(int(*)(int,char**))0x562cc212b650
  7. (int (*)(int, char **)) Function @0x562cc212b650
  8. [cling]% ttt
  9. [cling]$ exit
  10. user@ttyd:~$
复制代码

作者: 不点    时间: 2018-3-23 16:44
在下面的试验中,不使用 main,而使用 main2,则一切如愿,正确打印出 “this is my main”。
  1. user@ttyd:~$ cish
  2. [cling]$ int main2 (int argc, char **argv) { printf("this is my main\n"); return 0;}
  3. [cling]% ;main2
  4. (int (*)(int, char **)) Function @0x7f2089737070
  5. [cling]% main2
  6. this is my main
  7. [cling]% int(*ttt)(int,char**);
  8. [cling]% ttt=&main2
  9. (int (*)(int, char **)) Function @0x7f2089737070
  10. [cling]% ttt
  11. this is my main
  12. [cling]% exit
  13. user@ttyd:~$
复制代码



作者: 不点    时间: 2018-3-23 17:48
下面的试验,先看看 getcwd 函数的地址,以及函数的原型。然后执行这个函数,并把返回值保存在 tmp 变量中。getcwd() 的 man page 会告诉我们,应该释放掉 tmp 字符串所占用的空间。因此,我们调用 free 函数来释放 tmp 字符串。同样,在调用 free 之前,我们可以先用 “;free” 来很方便地查看 free 函数的 prototype。在释放掉 tmp 之后,我们再次执行 tmp,此时已经不能显示出当前工作目录了,而是显示出乱码。它没有崩溃,算是很幸运。C 语言很强大,但是,也需要我们很小心。稍有疏忽,就会出错。
  1. [cling]% ;getcwd
  2. (char *(*)(char *, size_t) throw()) Function @0x7fdf5de2ba90
  3. [cling]% char * tmp = getcwd(0,0)
  4. (char *) "/home/user"
  5. [cling]% tmp
  6. (char *) "/home/user"
  7. [cling]% ;free
  8. (void (*)(void *) throw()) Function @0x7fdf5ddb63e0
  9.   at /usr/include/stdlib.h:448:
  10. extern void free (void *__ptr) _
  11. [cling]% free(tmp)
  12. [cling]% tmp
  13. (char *) "P\xf2,\x82\xc3U"
  14. [cling]% tmp
  15. (char *) "P\xf2,\x82\xc3U"
  16. [cling]% exit
  17. user@ttyd:~$
复制代码


作者: 不点    时间: 2018-3-23 21:53
回复 不知大人的点评。显示乱码的,确实是 “乱”、“野” 指针造成的。

getcwd 函数的 man page,说得很清楚。getcwd (0,0) 会返回当前目录。此函数在执行过程中会动态分配一个内存块,并把当前目录的路径名称放在内存块中,而此内存块的地址就是返回值,即 tmp 变量的值。因此,调用者必须负责用 free 函数来释放掉 tmp 所指向的这个内存块。

以上这些内容都是容易理解的。

但是我有一个问题:假如我只是用 getcwd (0,0) 来显示当前目录,而不把返回值赋值给 tmp 变量,那么,有没有办法来释放掉 getcwd 所分配的内存呢?


作者: 不知    时间: 2018-3-23 23:54
不点 发表于 2018-3-23 21:53
回复 不知大人的点评。显示乱码的,确实是 “乱”、“野” 指针造成的。

getcwd 函数的 man page,说得 ...

C语言的灵活就在指针的运用,野指针问题只能靠程序员编程时注意。对于cish,其实可以把所有分配以及使用到指针变量的语句直接用{}括起来变成一个整的语句块,这样括号结束后里面自动分配(auto类型)的变量就会被自动释放,后面就无法访问那些错乱的指针了。
作者: 不点    时间: 2018-3-24 00:27
不知 发表于 2018-3-23 23:54
C语言的灵活就在指针的运用,野指针问题只能靠程序员编程时注意。对于cish,其实可以把所有分配以及使用 ...

放在花括号里面的 getcwd 函数,它分配的内存块仍然存在。在花括号之外,敲入 tmp 仍然能够显示出当前目录。执行 free(tmp) 之后,才释放掉 tmp 指向的空间。
  1. user@ttyd:~$ cish
  2. [cling]$ char *tmp
  3. (char *) nullptr
  4. [cling]% { tmp = getcwd(0,0); }
  5. [cling]% tmp
  6. (char *) "/home/user"
  7. [cling]% free(tmp)
  8. [cling]% tmp
  9. (char *) "\xe0\xfe\xf6" "C\x82U"
  10. [cling]%
复制代码

作者: 不知    时间: 2018-3-24 09:28
本帖最后由 不知 于 2018-3-24 09:41 编辑
不点 发表于 2018-3-24 00:27
放在花括号里面的 getcwd 函数,它分配的内存块仍然存在。在花括号之外,敲入 tmp 仍然能够显示出当前目 ...

tmp的定义应该在括号里面定义,使用tmp释放内存块后,再由C语言自动清理在{}里定义的tmp。


作者: 不点    时间: 2018-3-24 09:49
不知 发表于 2018-3-24 09:28
tmp的定义应该在括号里面定义,使用tmp释放内存块后,再由C语言自动清理在{}里定义的tmp。

你的例子也是要调用 free。看来必须调用 free 才能释放。它不能自动释放。
作者: slore    时间: 2018-3-24 10:08
看来还处在基本功能阶段,任重道远啊。

内存管理一般大些的项目自己会做 内存池管理。
new,malloc等将通过宏重定义到自己的创建函数。

int main() {
  mpool *m = jc_mem_new();
  func1(m)
     func2(m)
     char *tmp = jc_malloc(100, m);   //tmp的内存状态在mpool中记录

jc_mem_free(m); //mpool统一释放分配内存
  return 0;
}

分配出来的内存在前面保留一个管理用的结构体。
|strcut mem_info|真实分配内存首地址

tmp = later_free(getcwd(0,0), m);


花括号的问题,你代码写的不对,你char *tmp在外面声明的,生命周期不再括号内。

{char *tmp = getcwd(0,0);}
tmp将无法访问,tmp是栈上的空间,不一定清空还指向路径。
这个方式也只是释放tmp变量的地址空间可被再次使用,而不是getcwd产生的空间。

换成buff就明显了。


  1. char tmp[255];
  2. {
  3.   getcwd(tmp, 255);
  4. }
复制代码

  1. {
  2.   char tmp[255];
  3.   getcwd(tmp, 255);
  4. }
复制代码


这种临时用的,一般都是用局部buff,用完就自动释放了。

作者: 不点    时间: 2018-3-24 11:05
在 getcwd(0,0) 的情况,注意它的返回值扔掉了,没有赋给 tmp 或者任何其它变量。在这样的情况下,C++ 会不会自动释放 getcwd 所 malloc 的空间?


作者: 不点    时间: 2018-3-24 21:12
本帖最后由 不点 于 2018-3-25 15:30 编辑

活跃开发中的 “S” shell,刚刚有一次提交( latest commit 14 hours ago):

https://github.com/rain-1/s

我认同作者的很多理念。作者并不想打造一个 POSIX shell,他想打造一个语法简单的 shell。一个逻辑很复杂的 shell,容易让高手在里面隐藏后门。我可能会适当吸收这个作者的一些理念。



好东西很多,都可以帮助入门。下面这个 tiny shell 也很棒。顺便说,学习任何东西,“入门” 是最要紧的一件事。“入门” 没搞好,累死也学不会。“入门” 搞好了,一步一个阶梯,就上去了。去年我折腾 bash、zsh 都以失败告终。后来就连 dash 这个相对较小的 shell,也都把我绕进去了,像走迷宫,出不来。我明白了,为什么 bash、zsh、dash 已经那么 “好” 了,却还有人不厌其烦去开发新的 shell —— 原来 “好” 也只是相对的(又上升到哲学了,烦!)。

https://github.com/aaditya-thakkar/tiny-shell




我修改了 tsh.c,现在它能运行在 cish 下。在 cish 中敲入 .x  tsh.c 即可看到 tsh 提示符,敲入 quit 退出 tsh 返回到 cish。



作者: 不点    时间: 2018-3-27 20:26
这两天解决了 Cling 显示 (char *) 字符串的一个 bug,顺便增加了显示 (char **) 字符串数组的功能。有了这个功能,就可以在命令行方便地显示字符串数组了。举例:
  1. user@ttyd:~$ cish
  2. [cling]$ environ
  3. (char **) 0x563c26bf4a80
  4. LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
  5. LESSCLOSE=/usr/bin/lesspipe %s %s
  6. LANG=en_US.UTF-8
  7. XDG_SESSION_ID=1598
  8. HUSHLOGIN=FALSE
  9. USER=user
  10. PWD=/home/user
  11. HOME=/home/user
  12. XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
  13. MAIL=/var/mail/user
  14. SHELL=/bin/bash
  15. TERM=xterm-256color
  16. SHLVL=1
  17. LOGNAME=user
  18. XDG_RUNTIME_DIR=/run/user/1000
  19. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  20. LESSOPEN=| /usr/bin/lesspipe %s
  21. _=/home/user/inst/bin/cling
  22. COLUMS=176
  23. LINES=17643
  24. [cling]%
复制代码


上述 environ 数组的内容,与外部命令 env 或 printenv 显示的结果相同。
作者: 不点    时间: 2018-3-28 09:37
本帖最后由 不点 于 2018-3-28 14:41 编辑

十六进制转成十进制,很容易,直接打印出来

  1. [cling]% 0x13
  2. (int) 19
  3. [cling]%
复制代码


然而,把十进制转成十六进制,就没那么简单了。目前只找到了这个办法:

  1. [cling]% cout << hex << 19
  2. 13(std::basic_ostream<char, std::char_traits<char> >::__ostream_type &) @0x7fa6a95a9e20
  3. [cling]%
复制代码






【更新】已经让 cish 同时输出 10 进制 和 16 进制的结果。这就不必再用 cout << hex 了。


作者: gnuxwy    时间: 2018-3-28 21:24
老大工作又有进展了。。。过来瞧瞧。。。祝贺之。
十进制和十六进制转换,应该氏通过2进制中转比较好吧,乘2取1,  除2取整规则简单。。。

作者: 不点    时间: 2018-3-31 09:20
记录一下,找关键字 “job libc”,找到这个网页:

https://www.gnu.org/software/libc/manual/html_node/Job-Control.html

作者: 不点    时间: 2018-4-1 06:59
十分荣幸,站长亲自光临指导。

特别向站长汇报一下,Cling 本身就是一个强大的 C++ 脚本工具,可以用作 shell 编程,只不过需要按照 C++ 的规范来编程罢了(其实就是 C++ 脚本编程)。

cish 只是增加了与一个 “真正” shell 的一些兼容性(方便使用)而已。

如果看重 C++ 的强大能力,而且不嫌弃 Cling 的庞大身躯,那么用 Cling 即可进行各种开发,包括刚才提到的所谓 shell 编程(准确地说,是 C++ 脚本编程)。以站长的高超水平来看,这丝毫不成问题,轻松拿下。

如果同时又看重 shell 的方便操作,那就等着 cish 的逐步开发完善,这需要一个漫长的过程。

作者: wuyou    时间: 2018-4-1 08:07
不点 发表于 2018-4-1 06:59
十分荣幸,站长亲自光临指导。

特别向站长汇报一下,Cling 本身就是一个强大的 C++ 脚本工具,可以用作  ...

这些年学编程,东一榔头西一棒子,没个准头。
花费时间最多的是ios开发,只是终无所成,权当娱乐。
最终发现学 shell 和 php 对于网站维护来说最为务实,今后也将作为重点方向。
以后向大师好好学习学习,接触一些新的东西。
作者: 不点    时间: 2018-4-2 12:01
搜到的知识,记录一下——

Linux 技巧:让进程在后台可靠运行的几种方法
https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

主要讲了:

nohup、setsid、&
disown
screen

作者: 不点    时间: 2018-4-2 15:12
Linux Application Development (paperback) (2nd Edition)
https://flylib.com/books/en/1.381.1/

作者: 不点    时间: 2018-4-5 12:37
攻击者把 public 用户下的文件删除了!wintoflash 该采取安全措施了。我暂时想到了如下几点:

1、禁止 public 用户修改自己的口令。可以通过修改 /etc/shadow 文件来实现。man shadow 给出如下信息:

       minimum password age
           The minimum password age is the number of days the user will have to wait before she will be allowed to change her password again.
           An empty field and value 0 mean that there are no minimum password age.
       maximum password age
           The maximum password age is the number of days after which the user will have to change her password.
           After this number of days is elapsed, the password may still be valid. The user should be asked to change her password the next time
           she will log in.
           An empty field means that there are no maximum password age, no password warning period, and no password inactivity period (see below).
           If the maximum password age is lower than the minimum password age, the user cannot change her password.

           最后一句就谈到禁止某个用户修改口令的方法。

2、禁止 /home/public 目录被修改。可以通过 chattr +i /home/public 来实现(没有验证过,只是猜的)。

3、注意 /home/public/.bash_history 之类的文件,应该可以被用户修改,或被追加(append)。

4、防止用户修改 login shell(还没有研究过具体方法)。


作者: 不知    时间: 2018-4-5 13:27
本帖最后由 不知 于 2018-4-5 17:00 编辑
不点 发表于 2018-4-5 12:37
攻击者把 public 用户下的文件删除了!wintoflash 该采取安全措施了。我暂时想到了如下几点:

1、禁止 p ...

看来安全问题还是最重要的问题,用setfacl命令给public单独设置权限,使其不能使用passwd等与测试无关的命令。其实也可以尝试发布一个deb测试包,只运行cish的话大概只需要23M(deb默认压缩),不算太大,可以写一个脚本来制作,用不了几分钟。

  1. gen_deb.sh //生成deb文件的主程序
  2. cish.script //用于启动cish的脚本的后半段
  3. DEBIAN //deb的配置文件夹
  4. DEBIAN/control //deb的主配置文件。
  5. list.txt //cling文件列表
复制代码
list.txt
  1. .
  2. ./lib
  3. ./lib/clang
  4. ./lib/clang/5.0.0
  5. ./lib/clang/5.0.0/include
  6. ./lib/clang/5.0.0/include/tbmintrin.h
  7. ./lib/clang/5.0.0/include/x86intrin.h
  8. ./lib/clang/5.0.0/include/wmmintrin.h
  9. ./lib/clang/5.0.0/include/avx512dqintrin.h
  10. ./lib/clang/5.0.0/include/stdnoreturn.h
  11. ./lib/clang/5.0.0/include/xopintrin.h
  12. ./lib/clang/5.0.0/include/bmi2intrin.h
  13. ./lib/clang/5.0.0/include/avx512vpopcntdqintrin.h
  14. ./lib/clang/5.0.0/include/ia32intrin.h
  15. ./lib/clang/5.0.0/include/float.h
  16. ./lib/clang/5.0.0/include/arm_neon.h
  17. ./lib/clang/5.0.0/include/rtmintrin.h
  18. ./lib/clang/5.0.0/include/vadefs.h
  19. ./lib/clang/5.0.0/include/unwind.h
  20. ./lib/clang/5.0.0/include/tmmintrin.h
  21. ./lib/clang/5.0.0/include/xsavesintrin.h
  22. ./lib/clang/5.0.0/include/__clang_cuda_intrinsics.h
  23. ./lib/clang/5.0.0/include/limits.h
  24. ./lib/clang/5.0.0/include/xsaveintrin.h
  25. ./lib/clang/5.0.0/include/armintr.h
  26. ./lib/clang/5.0.0/include/cpuid.h
  27. ./lib/clang/5.0.0/include/fma4intrin.h
  28. ./lib/clang/5.0.0/include/clflushoptintrin.h
  29. ./lib/clang/5.0.0/include/lzcntintrin.h
  30. ./lib/clang/5.0.0/include/__clang_cuda_runtime_wrapper.h
  31. ./lib/clang/5.0.0/include/altivec.h
  32. ./lib/clang/5.0.0/include/adxintrin.h
  33. ./lib/clang/5.0.0/include/__wmmintrin_aes.h
  34. ./lib/clang/5.0.0/include/rdseedintrin.h
  35. ./lib/clang/5.0.0/include/stdint.h
  36. ./lib/clang/5.0.0/include/avx512vlcdintrin.h
  37. ./lib/clang/5.0.0/include/avx512vldqintrin.h
  38. ./lib/clang/5.0.0/include/avx512ifmaintrin.h
  39. ./lib/clang/5.0.0/include/avxintrin.h
  40. ./lib/clang/5.0.0/include/xtestintrin.h
  41. ./lib/clang/5.0.0/include/xsavecintrin.h
  42. ./lib/clang/5.0.0/include/avx512vlbwintrin.h
  43. ./lib/clang/5.0.0/include/module.modulemap
  44. ./lib/clang/5.0.0/include/stdbool.h
  45. ./lib/clang/5.0.0/include/__clang_cuda_builtin_vars.h
  46. ./lib/clang/5.0.0/include/nmmintrin.h
  47. ./lib/clang/5.0.0/include/smmintrin.h
  48. ./lib/clang/5.0.0/include/__clang_cuda_cmath.h
  49. ./lib/clang/5.0.0/include/htmintrin.h
  50. ./lib/clang/5.0.0/include/avx512vbmivlintrin.h
  51. ./lib/clang/5.0.0/include/__clang_cuda_complex_builtins.h
  52. ./lib/clang/5.0.0/include/f16cintrin.h
  53. ./lib/clang/5.0.0/include/opencl-c.h
  54. ./lib/clang/5.0.0/include/arm_acle.h
  55. ./lib/clang/5.0.0/include/stddef.h
  56. ./lib/clang/5.0.0/include/avx512erintrin.h
  57. ./lib/clang/5.0.0/include/fmaintrin.h
  58. ./lib/clang/5.0.0/include/inttypes.h
  59. ./lib/clang/5.0.0/include/bmiintrin.h
  60. ./lib/clang/5.0.0/include/pkuintrin.h
  61. ./lib/clang/5.0.0/include/s390intrin.h
  62. ./lib/clang/5.0.0/include/__stddef_max_align_t.h
  63. ./lib/clang/5.0.0/include/avx512fintrin.h
  64. ./lib/clang/5.0.0/include/avx512pfintrin.h
  65. ./lib/clang/5.0.0/include/avx512cdintrin.h
  66. ./lib/clang/5.0.0/include/msa.h
  67. ./lib/clang/5.0.0/include/tgmath.h
  68. ./lib/clang/5.0.0/include/xmmintrin.h
  69. ./lib/clang/5.0.0/include/avx512vlintrin.h
  70. ./lib/clang/5.0.0/include/avx2intrin.h
  71. ./lib/clang/5.0.0/include/cuda_wrappers
  72. ./lib/clang/5.0.0/include/cuda_wrappers/complex
  73. ./lib/clang/5.0.0/include/cuda_wrappers/algorithm
  74. ./lib/clang/5.0.0/include/cuda_wrappers/new
  75. ./lib/clang/5.0.0/include/stdarg.h
  76. ./lib/clang/5.0.0/include/__wmmintrin_pclmul.h
  77. ./lib/clang/5.0.0/include/immintrin.h
  78. ./lib/clang/5.0.0/include/stdalign.h
  79. ./lib/clang/5.0.0/include/avx512ifmavlintrin.h
  80. ./lib/clang/5.0.0/include/prfchwintrin.h
  81. ./lib/clang/5.0.0/include/mm3dnow.h
  82. ./lib/clang/5.0.0/include/iso646.h
  83. ./lib/clang/5.0.0/include/mm_malloc.h
  84. ./lib/clang/5.0.0/include/fxsrintrin.h
  85. ./lib/clang/5.0.0/include/ammintrin.h
  86. ./lib/clang/5.0.0/include/avx512vbmiintrin.h
  87. ./lib/clang/5.0.0/include/varargs.h
  88. ./lib/clang/5.0.0/include/htmxlintrin.h
  89. ./lib/clang/5.0.0/include/clzerointrin.h
  90. ./lib/clang/5.0.0/include/intrin.h
  91. ./lib/clang/5.0.0/include/__clang_cuda_math_forward_declares.h
  92. ./lib/clang/5.0.0/include/popcntintrin.h
  93. ./lib/clang/5.0.0/include/shaintrin.h
  94. ./lib/clang/5.0.0/include/lwpintrin.h
  95. ./lib/clang/5.0.0/include/vecintrin.h
  96. ./lib/clang/5.0.0/include/avx512bwintrin.h
  97. ./lib/clang/5.0.0/include/xsaveoptintrin.h
  98. ./lib/clang/5.0.0/include/pmmintrin.h
  99. ./lib/clang/5.0.0/include/mmintrin.h
  100. ./lib/clang/5.0.0/include/emmintrin.h
  101. ./lib/clang/5.0.0/include/stdatomic.h
  102. ./lib/clang/5.0.0/include/mwaitxintrin.h
  103. ./bin
  104. ./bin/cling
  105. ./share
  106. ./share/man
  107. ./share/man/man1
  108. ./share/cling
  109. ./share/cling/Jupyter
  110. ./share/cling/Jupyter/kernel
  111. ./share/cling/Jupyter/kernel/cling-cpp17
  112. ./share/cling/Jupyter/kernel/cling-cpp17/kernel.json
  113. ./share/cling/Jupyter/kernel/scripts
  114. ./share/cling/Jupyter/kernel/scripts/jupyter-cling-kernel
  115. ./share/cling/Jupyter/kernel/.gitignore
  116. ./share/cling/Jupyter/kernel/setup.py
  117. ./share/cling/Jupyter/kernel/clingkernel.py
  118. ./share/cling/Jupyter/kernel/cling.ipynb
  119. ./share/cling/Jupyter/kernel/cling-cpp14
  120. ./share/cling/Jupyter/kernel/cling-cpp14/kernel.json
  121. ./share/cling/Jupyter/kernel/cling-cpp11
  122. ./share/cling/Jupyter/kernel/cling-cpp11/kernel.json
  123. ./share/cling/Jupyter/kernel/cling-cpp1z
  124. ./share/cling/Jupyter/kernel/cling-cpp1z/kernel.json
  125. ./libexec
  126. ./include
  127. ./include/clang-c
  128. ./include/clang-c/Documentation.h
  129. ./include/clang-c/Index.h
  130. ./include/clang-c/CXString.h
  131. ./include/clang-c/CXCompilationDatabase.h
  132. ./include/clang-c/Platform.h
  133. ./include/clang-c/CXErrorCode.h
  134. ./include/clang-c/BuildSystem.h
  135. ./include/clang
  136. ./include/clang/Analysis
  137. ./include/clang/Analysis/FlowSensitive
  138. ./include/clang/Analysis/FlowSensitive/DataflowValues.h
  139. ./include/clang/Analysis/AnalysisContext.h
  140. ./include/clang/Analysis/CallGraph.h
  141. ./include/clang/Analysis/CodeInjector.h
  142. ./include/clang/Analysis/CFG.h
  143. ./include/clang/Analysis/CloneDetection.h
  144. ./include/clang/Analysis/CFGStmtMap.h
  145. ./include/clang/Analysis/DomainSpecific
  146. ./include/clang/Analysis/DomainSpecific/ObjCNoReturn.h
  147. ./include/clang/Analysis/DomainSpecific/CocoaConventions.h
  148. ./include/clang/Analysis/ProgramPoint.h
  149. ./include/clang/Analysis/AnalysisDiagnostic.h
  150. ./include/clang/Analysis/Support
  151. ./include/clang/Analysis/Support/BumpVector.h
  152. ./include/clang/Analysis/Analyses
  153. ./include/clang/Analysis/Analyses/PseudoConstantAnalysis.h
  154. ./include/clang/Analysis/Analyses/ThreadSafety.h
  155. ./include/clang/Analysis/Analyses/Dominators.h
  156. ./include/clang/Analysis/Analyses/ThreadSafetyLogical.h
  157. ./include/clang/Analysis/Analyses/ThreadSafetyUtil.h
  158. ./include/clang/Analysis/Analyses/ThreadSafetyTraverse.h
  159. ./include/clang/Analysis/Analyses/PostOrderCFGView.h
  160. ./include/clang/Analysis/Analyses/Consumed.h
  161. ./include/clang/Analysis/Analyses/FormatString.h
  162. ./include/clang/Analysis/Analyses/OSLog.h
  163. ./include/clang/Analysis/Analyses/ReachableCode.h
  164. ./include/clang/Analysis/Analyses/ThreadSafetyCommon.h
  165. ./include/clang/Analysis/Analyses/LiveVariables.h
  166. ./include/clang/Analysis/Analyses/ThreadSafetyOps.def
  167. ./include/clang/Analysis/Analyses/ThreadSafetyTIL.h
  168. ./include/clang/Analysis/Analyses/CFGReachabilityAnalysis.h
  169. ./include/clang/Analysis/Analyses/UninitializedValues.h
  170. ./include/clang/Basic
  171. ./include/clang/Basic/PartialDiagnostic.h
  172. ./include/clang/Basic/IdentifierTable.h
  173. ./include/clang/Basic/Linkage.h
  174. ./include/clang/Basic/DebugInfoOptions.h
  175. ./include/clang/Basic/DiagnosticIndexName.inc
  176. ./include/clang/Basic/DiagnosticOptions.h
  177. ./include/clang/Basic/AttrList.inc
  178. ./include/clang/Basic/MemoryBufferCache.h
  179. ./include/clang/Basic/OperatorKinds.h
  180. ./include/clang/Basic/Attributes.h
  181. ./include/clang/Basic/Specifiers.h
  182. ./include/clang/Basic/OperatorPrecedence.h
  183. ./include/clang/Basic/FileManager.h
  184. ./include/clang/Basic/DiagnosticASTKinds.inc
  185. ./include/clang/Basic/TargetBuiltins.h
  186. ./include/clang/Basic/MacroBuilder.h
  187. ./include/clang/Basic/BuiltinsPPC.def
  188. ./include/clang/Basic/SourceManager.h
  189. ./include/clang/Basic/PrettyStackTrace.h
  190. ./include/clang/Basic/TokenKinds.h
  191. ./include/clang/Basic/DiagnosticDriverKinds.inc
  192. ./include/clang/Basic/SourceLocation.h
  193. ./include/clang/Basic/AttrSubjectMatchRules.h
  194. ./include/clang/Basic/DiagnosticSerializationKinds.inc
  195. ./include/clang/Basic/TargetOptions.h
  196. ./include/clang/Basic/DiagnosticParseKinds.inc
  197. ./include/clang/Basic/VirtualFileSystem.h
  198. ./include/clang/Basic/ObjCRuntime.h
  199. ./include/clang/Basic/PlistSupport.h
  200. ./include/clang/Basic/TargetInfo.h
  201. ./include/clang/Basic/BuiltinsXCore.def
  202. ./include/clang/Basic/Sanitizers.def
  203. ./include/clang/Basic/Version.h
  204. ./include/clang/Basic/Cuda.h
  205. ./include/clang/Basic/DiagnosticCommonKinds.inc
  206. ./include/clang/Basic/Lambda.h
  207. ./include/clang/Basic/TokenKinds.def
  208. ./include/clang/Basic/BuiltinsAMDGPU.def
  209. ./include/clang/Basic/AllDiagnostics.h
  210. ./include/clang/Basic/BuiltinsSystemZ.def
  211. ./include/clang/Basic/OperatorKinds.def
  212. ./include/clang/Basic/OpenMPKinds.h
  213. ./include/clang/Basic/arm_neon.inc
  214. ./include/clang/Basic/BuiltinsMips.def
  215. ./include/clang/Basic/DiagnosticGroups.inc
  216. ./include/clang/Basic/OpenCLOptions.h
  217. ./include/clang/Basic/CapturedStmt.h
  218. ./include/clang/Basic/DiagnosticSemaKinds.inc
  219. ./include/clang/Basic/PragmaKinds.h
  220. ./include/clang/Basic/BuiltinsNEON.def
  221. ./include/clang/Basic/FileSystemStatCache.h
  222. ./include/clang/Basic/BuiltinsAArch64.def
  223. ./include/clang/Basic/AttrHasAttributeImpl.inc
  224. ./include/clang/Basic/AddressSpaces.h
  225. ./include/clang/Basic/Visibility.h
  226. ./include/clang/Basic/Builtins.h
  227. ./include/clang/Basic/BuiltinsARM.def
  228. ./include/clang/Basic/VersionTuple.h
  229. ./include/clang/Basic/DiagnosticLexKinds.inc
  230. ./include/clang/Basic/CommentOptions.h
  231. ./include/clang/Basic/DiagnosticFrontendKinds.inc
  232. ./include/clang/Basic/BuiltinsX86.def
  233. ./include/clang/Basic/SanitizerBlacklist.h
  234. ./include/clang/Basic/LangOptions.h
  235. ./include/clang/Basic/LLVM.h
  236. ./include/clang/Basic/Module.h
  237. ./include/clang/Basic/BuiltinsHexagon.def
  238. ./include/clang/Basic/CharInfo.h
  239. ./include/clang/Basic/ExceptionSpecificationType.h
  240. ./include/clang/Basic/DiagnosticIDs.h
  241. ./include/clang/Basic/ExpressionTraits.h
  242. ./include/clang/Basic/Builtins.def
  243. ./include/clang/Basic/OpenCLImageTypes.def
  244. ./include/clang/Basic/TypeTraits.h
  245. ./include/clang/Basic/BuiltinsNVPTX.def
  246. ./include/clang/Basic/BuiltinsLe64.def
  247. ./include/clang/Basic/Sanitizers.h
  248. ./include/clang/Basic/Diagnostic.h
  249. ./include/clang/Basic/XRayLists.h
  250. ./include/clang/Basic/TemplateKinds.h
  251. ./include/clang/Basic/DiagnosticOptions.def
  252. ./include/clang/Basic/LangOptions.def
  253. ./include/clang/Basic/BuiltinsNios2.def
  254. ./include/clang/Basic/FileSystemOptions.h
  255. ./include/clang/Basic/DiagnosticAnalysisKinds.inc
  256. ./include/clang/Basic/DiagnosticCategories.h
  257. ./include/clang/Basic/DiagnosticCommentKinds.inc
  258. ./include/clang/Basic/Version.inc
  259. ./include/clang/Basic/BuiltinsWebAssembly.def
  260. ./include/clang/Basic/AttrSubMatchRulesList.inc
  261. ./include/clang/Basic/ABI.h
  262. ./include/clang/Basic/OpenMPKinds.def
  263. ./include/clang/Basic/SourceManagerInternals.h
  264. ./include/clang/Basic/AttrKinds.h
  265. ./include/clang/Basic/TargetCXXABI.h
  266. ./include/clang/Basic/OpenCLExtensions.def
  267. ./include/clang/Basic/BuiltinsX86_64.def
  268. ./include/clang/StaticAnalyzer
  269. ./include/clang/StaticAnalyzer/Core
  270. ./include/clang/StaticAnalyzer/Core/IssueHash.h
  271. ./include/clang/StaticAnalyzer/Core/Checker.h
  272. ./include/clang/StaticAnalyzer/Core/PathSensitive
  273. ./include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h
  274. ./include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h
  275. ./include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
  276. ./include/clang/StaticAnalyzer/Core/PathSensitive/CheckerHelpers.h
  277. ./include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h
  278. ./include/clang/StaticAnalyzer/Core/PathSensitive/SummaryManager.h
  279. ./include/clang/StaticAnalyzer/Core/PathSensitive/DynamicTypeMap.h
  280. ./include/clang/StaticAnalyzer/Core/PathSensitive/Regions.def
  281. ./include/clang/StaticAnalyzer/Core/PathSensitive/TaintTag.h
  282. ./include/clang/StaticAnalyzer/Core/PathSensitive/SimpleConstraintManager.h
  283. ./include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h
  284. ./include/clang/StaticAnalyzer/Core/PathSensitive/SymExpr.h
  285. ./include/clang/StaticAnalyzer/Core/PathSensitive/DynamicTypeInfo.h
  286. ./include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h
  287. ./include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
  288. ./include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h
  289. ./include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
  290. ./include/clang/StaticAnalyzer/Core/PathSensitive/SValVisitor.h
  291. ./include/clang/StaticAnalyzer/Core/PathSensitive/Environment.h
  292. ./include/clang/StaticAnalyzer/Core/PathSensitive/FunctionSummary.h
  293. ./include/clang/StaticAnalyzer/Core/PathSensitive/BlockCounter.h
  294. ./include/clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h
  295. ./include/clang/StaticAnalyzer/Core/PathSensitive/Symbols.def
  296. ./include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h
  297. ./include/clang/StaticAnalyzer/Core/PathSensitive/Store.h
  298. ./include/clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h
  299. ./include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h
  300. ./include/clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h
  301. ./include/clang/StaticAnalyzer/Core/PathSensitive/StoreRef.h
  302. ./include/clang/StaticAnalyzer/Core/PathSensitive/TaintManager.h
  303. ./include/clang/StaticAnalyzer/Core/PathSensitive/SVals.def
  304. ./include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h
  305. ./include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h
  306. ./include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
  307. ./include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
  308. ./include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
  309. ./include/clang/StaticAnalyzer/Core/CheckerRegistry.h
  310. ./include/clang/StaticAnalyzer/Core/Analyses.def
  311. ./include/clang/StaticAnalyzer/Core/BugReporter
  312. ./include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
  313. ./include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
  314. ./include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
  315. ./include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
  316. ./include/clang/StaticAnalyzer/Core/BugReporter/CommonBugCategories.h
  317. ./include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
  318. ./include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h
  319. ./include/clang/StaticAnalyzer/Core/CheckerOptInfo.h
  320. ./include/clang/StaticAnalyzer/Core/CheckerManager.h
  321. ./include/clang/StaticAnalyzer/Checkers
  322. ./include/clang/StaticAnalyzer/Checkers/SValExplainer.h
  323. ./include/clang/StaticAnalyzer/Checkers/LocalCheckers.h
  324. ./include/clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h
  325. ./include/clang/StaticAnalyzer/Checkers/ClangCheckers.h
  326. ./include/clang/StaticAnalyzer/Checkers/ObjCRetainCount.h
  327. ./include/clang/StaticAnalyzer/Checkers/Checkers.inc
  328. ./include/clang/StaticAnalyzer/Frontend
  329. ./include/clang/StaticAnalyzer/Frontend/ModelConsumer.h
  330. ./include/clang/StaticAnalyzer/Frontend/FrontendActions.h
  331. ./include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h
  332. ./include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
  333. ./include/clang/Lex
  334. ./include/clang/Lex/HeaderSearchOptions.h
  335. ./include/clang/Lex/MultipleIncludeOpt.h
  336. ./include/clang/Lex/PPConditionalDirectiveRecord.h
  337. ./include/clang/Lex/PreprocessorOptions.h
  338. ./include/clang/Lex/ModuleMap.h
  339. ./include/clang/Lex/Preprocessor.h
  340. ./include/clang/Lex/ModuleLoader.h
  341. ./include/clang/Lex/Token.h
  342. ./include/clang/Lex/PTHLexer.h
  343. ./include/clang/Lex/TokenConcatenation.h
  344. ./include/clang/Lex/MacroArgs.h
  345. ./include/clang/Lex/LiteralSupport.h
  346. ./include/clang/Lex/ExternalPreprocessorSource.h
  347. ./include/clang/Lex/PTHManager.h
  348. ./include/clang/Lex/LexDiagnostic.h
  349. ./include/clang/Lex/HeaderMapTypes.h
  350. ./include/clang/Lex/MacroInfo.h
  351. ./include/clang/Lex/PreprocessingRecord.h
  352. ./include/clang/Lex/TokenLexer.h
  353. ./include/clang/Lex/Lexer.h
  354. ./include/clang/Lex/DirectoryLookup.h
  355. ./include/clang/Lex/CodeCompletionHandler.h
  356. ./include/clang/Lex/ScratchBuffer.h
  357. ./include/clang/Lex/PreprocessorLexer.h
  358. ./include/clang/Lex/HeaderMap.h
  359. ./include/clang/Lex/PPCallbacks.h
  360. ./include/clang/Lex/Pragma.h
  361. ./include/clang/Lex/HeaderSearch.h
  362. ./include/clang/Parse
  363. ./include/clang/Parse/ParseDiagnostic.h
  364. ./include/clang/Parse/RAIIObjectsForParser.h
  365. ./include/clang/Parse/AttrSubMatchRulesParserStringSwitches.inc
  366. ./include/clang/Parse/ParseAST.h
  367. ./include/clang/Parse/AttrParserStringSwitches.inc
  368. ./include/clang/Parse/Parser.h
  369. ./include/clang/Format
  370. ./include/clang/Format/Format.h
  371. ./include/clang/Index
  372. ./include/clang/Index/USRGeneration.h
  373. ./include/clang/Index/IndexDataConsumer.h
  374. ./include/clang/Index/CodegenNameGenerator.h
  375. ./include/clang/Index/IndexingAction.h
  376. ./include/clang/Index/CommentToXML.h
  377. ./include/clang/Index/IndexSymbol.h
  378. ./include/clang/Sema
  379. ./include/clang/Sema/DeclSpec.h
  380. ./include/clang/Sema/AttrParsedAttrImpl.inc
  381. ./include/clang/Sema/Lookup.h
  382. ./include/clang/Sema/IdentifierResolver.h
  383. ./include/clang/Sema/AttrSpellingListIndex.inc
  384. ./include/clang/Sema/AttrParsedAttrKinds.inc
  385. ./include/clang/Sema/Sema.h
  386. ./include/clang/Sema/LoopHint.h
  387. ./include/clang/Sema/Overload.h
  388. ./include/clang/Sema/SemaConsumer.h
  389. ./include/clang/Sema/CleanupInfo.h
  390. ./include/clang/Sema/TemplateDeduction.h
  391. ./include/clang/Sema/Designator.h
  392. ./include/clang/Sema/Weak.h
  393. ./include/clang/Sema/ExternalSemaSource.h
  394. ./include/clang/Sema/AttributeList.h
  395. ./include/clang/Sema/AnalysisBasedWarnings.h
  396. ./include/clang/Sema/DelayedDiagnostic.h
  397. ./include/clang/Sema/AttrParsedAttrList.inc
  398. ./include/clang/Sema/ScopeInfo.h
  399. ./include/clang/Sema/CodeCompleteConsumer.h
  400. ./include/clang/Sema/SemaDiagnostic.h
  401. ./include/clang/Sema/PrettyDeclStackTrace.h
  402. ./include/clang/Sema/Scope.h
  403. ./include/clang/Sema/AttrTemplateInstantiate.inc
  404. ./include/clang/Sema/SemaFixItUtils.h
  405. ./include/clang/Sema/SemaInternal.h
  406. ./include/clang/Sema/Initialization.h
  407. ./include/clang/Sema/ParsedTemplate.h
  408. ./include/clang/Sema/Ownership.h
  409. ./include/clang/Sema/CXXFieldCollector.h
  410. ./include/clang/Sema/ObjCMethodList.h
  411. ./include/clang/Sema/CodeCompleteOptions.h
  412. ./include/clang/Sema/SemaLambda.h
  413. ./include/clang/Sema/TypoCorrection.h
  414. ./include/clang/Sema/MultiplexExternalSemaSource.h
  415. ./include/clang/Sema/Template.h
  416. ./include/clang/CodeGen
  417. ./include/clang/CodeGen/SwiftCallingConv.h
  418. ./include/clang/CodeGen/BackendUtil.h
  419. ./include/clang/CodeGen/ModuleBuilder.h
  420. ./include/clang/CodeGen/CodeGenAction.h
  421. ./include/clang/CodeGen/ObjectFilePCHContainerOperations.h
  422. ./include/clang/CodeGen/ConstantInitBuilder.h
  423. ./include/clang/CodeGen/CodeGenABITypes.h
  424. ./include/clang/CodeGen/ConstantInitFuture.h
  425. ./include/clang/CodeGen/CGFunctionInfo.h
  426. ./include/clang/FrontendTool
  427. ./include/clang/FrontendTool/Utils.h
  428. ./include/clang/ARCMigrate
  429. ./include/clang/ARCMigrate/FileRemapper.h
  430. ./include/clang/ARCMigrate/ARCMTActions.h
  431. ./include/clang/ARCMigrate/ARCMT.h
  432. ./include/clang/Serialization
  433. ./include/clang/Serialization/SerializationDiagnostic.h
  434. ./include/clang/Serialization/ModuleManager.h
  435. ./include/clang/Serialization/ModuleFileExtension.h
  436. ./include/clang/Serialization/ASTWriter.h
  437. ./include/clang/Serialization/ASTBitCodes.h
  438. ./include/clang/Serialization/GlobalModuleIndex.h
  439. ./include/clang/Serialization/ContinuousRangeMap.h
  440. ./include/clang/Serialization/Module.h
  441. ./include/clang/Serialization/ASTReader.h
  442. ./include/clang/Serialization/AttrPCHWrite.inc
  443. ./include/clang/Serialization/ASTDeserializationListener.h
  444. ./include/clang/Serialization/AttrPCHRead.inc
  445. ./include/clang/Config
  446. ./include/clang/Config/config.h
  447. ./include/clang/Frontend
  448. ./include/clang/Frontend/CodeGenOptions.def
  449. ./include/clang/Frontend/SerializedDiagnosticReader.h
  450. ./include/clang/Frontend/LayoutOverrideSource.h
  451. ./include/clang/Frontend/FrontendDiagnostic.h
  452. ./include/clang/Frontend/ASTConsumers.h
  453. ./include/clang/Frontend/MigratorOptions.h
  454. ./include/clang/Frontend/CommandLineSourceLoc.h
  455. ./include/clang/Frontend/FrontendPluginRegistry.h
  456. ./include/clang/Frontend/PreprocessorOutputOptions.h
  457. ./include/clang/Frontend/TextDiagnostic.h
  458. ./include/clang/Frontend/Utils.h
  459. ./include/clang/Frontend/VerifyDiagnosticConsumer.h
  460. ./include/clang/Frontend/LangStandard.h
  461. ./include/clang/Frontend/SerializedDiagnosticPrinter.h
  462. ./include/clang/Frontend/LangStandards.def
  463. ./include/clang/Frontend/PCHContainerOperations.h
  464. ./include/clang/Frontend/CompilerInstance.h
  465. ./include/clang/Frontend/SerializedDiagnostics.h
  466. ./include/clang/Frontend/FrontendOptions.h
  467. ./include/clang/Frontend/ASTUnit.h
  468. ./include/clang/Frontend/TextDiagnosticPrinter.h
  469. ./include/clang/Frontend/FrontendActions.h
  470. ./include/clang/Frontend/LogDiagnosticPrinter.h
  471. ./include/clang/Frontend/FrontendAction.h
  472. ./include/clang/Frontend/MultiplexConsumer.h
  473. ./include/clang/Frontend/DiagnosticRenderer.h
  474. ./include/clang/Frontend/ChainedDiagnosticConsumer.h
  475. ./include/clang/Frontend/DependencyOutputOptions.h
  476. ./include/clang/Frontend/CodeGenOptions.h
  477. ./include/clang/Frontend/PrecompiledPreamble.h
  478. ./include/clang/Frontend/TextDiagnosticBuffer.h
  479. ./include/clang/Frontend/CompilerInvocation.h
  480. ./include/clang/Tooling
  481. ./include/clang/Tooling/Core
  482. ./include/clang/Tooling/Core/Lookup.h
  483. ./include/clang/Tooling/Core/QualTypeNames.h
  484. ./include/clang/Tooling/Core/Replacement.h
  485. ./include/clang/Tooling/Core/Diagnostic.h
  486. ./include/clang/Tooling/ArgumentsAdjusters.h
  487. ./include/clang/Tooling/Tooling.h
  488. ./include/clang/Tooling/Refactoring
  489. ./include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h
  490. ./include/clang/Tooling/Refactoring/Rename
  491. ./include/clang/Tooling/Refactoring/Rename/RenamingAction.h
  492. ./include/clang/Tooling/Refactoring/Rename/USRFinder.h
  493. ./include/clang/Tooling/Refactoring/Rename/USRLocFinder.h
  494. ./include/clang/Tooling/Refactoring/Rename/USRFindingAction.h
  495. ./include/clang/Tooling/Refactoring/AtomicChange.h
  496. ./include/clang/Tooling/FixIt.h
  497. ./include/clang/Tooling/JSONCompilationDatabase.h
  498. ./include/clang/Tooling/FileMatchTrie.h
  499. ./include/clang/Tooling/RefactoringCallbacks.h
  500. ./include/clang/Tooling/CompilationDatabase.h
  501. ./include/clang/Tooling/CommonOptionsParser.h
  502. ./include/clang/Tooling/DiagnosticsYaml.h
  503. ./include/clang/Tooling/ReplacementsYaml.h
  504. ./include/clang/Tooling/Refactoring.h
  505. ./include/clang/Tooling/CompilationDatabasePluginRegistry.h
  506. ./include/clang/AST
  507. ./include/clang/AST/CommentVisitor.h
  508. ./include/clang/AST/DeclTemplate.h
  509. ./include/clang/AST/StmtVisitor.h
  510. ./include/clang/AST/TemplateName.h
  511. ./include/clang/AST/CommentHTMLNamedCharacterReferences.inc
  512. ./include/clang/AST/ASTConsumer.h
  513. ./include/clang/AST/ASTStructuralEquivalence.h
  514. ./include/clang/AST/Attrs.inc
  515. ./include/clang/AST/DeclObjC.h
  516. ./include/clang/AST/StmtGraphTraits.h
  517. ./include/clang/AST/VTableBuilder.h
  518. ./include/clang/AST/StmtIterator.h
  519. ./include/clang/AST/CommentBriefParser.h
  520. ./include/clang/AST/ASTVector.h
  521. ./include/clang/AST/CommentHTMLTags.inc
  522. ./include/clang/AST/ExprCXX.h
  523. ./include/clang/AST/CommentCommandInfo.inc
  524. ./include/clang/AST/DeclGroup.h
  525. ./include/clang/AST/TemplateBase.h
  526. ./include/clang/AST/AttrImpl.inc
  527. ./include/clang/AST/Stmt.h
  528. ./include/clang/AST/StmtOpenMP.h
  529. ./include/clang/AST/DeclAccessPair.h
  530. ./include/clang/AST/ASTDiagnostic.h
  531. ./include/clang/AST/CommentNodes.inc
  532. ./include/clang/AST/CommentCommandList.inc
  533. ./include/clang/AST/Availability.h
  534. ./include/clang/AST/LocInfoType.h
  535. ./include/clang/AST/EvaluatedExprVisitor.h
  536. ./include/clang/AST/ExprObjC.h
  537. ./include/clang/AST/CommentDiagnostic.h
  538. ./include/clang/AST/DeclarationName.h
  539. ./include/clang/AST/Redeclarable.h
  540. ./include/clang/AST/BaseSubobject.h
  541. ./include/clang/AST/BuiltinTypes.def
  542. ./include/clang/AST/CommentLexer.h
  543. ./include/clang/AST/NSAPI.h
  544. ./include/clang/AST/OperationKinds.h
  545. ./include/clang/AST/ASTUnresolvedSet.h
  546. ./include/clang/AST/CommentCommandTraits.h
  547. ./include/clang/AST/ASTLambda.h
  548. ./include/clang/AST/TypeLocNodes.def
  549. ./include/clang/AST/RecordLayout.h
  550. ./include/clang/AST/ASTContext.h
  551. ./include/clang/AST/SelectorLocationsKind.h
  552. ./include/clang/AST/ASTImporter.h
  553. ./include/clang/AST/Attr.h
  554. ./include/clang/AST/ASTFwd.h
  555. ./include/clang/AST/CommentParser.h
  556. ./include/clang/AST/NestedNameSpecifier.h
  557. ./include/clang/AST/CXXInheritance.h
  558. ./include/clang/AST/TypeOrdering.h
  559. ./include/clang/AST/TypeNodes.def
  560. ./include/clang/AST/ASTMutationListener.h
  561. ./include/clang/AST/MangleNumberingContext.h
  562. ./include/clang/AST/TypeLoc.h
  563. ./include/clang/AST/StmtNodes.inc
  564. ./include/clang/AST/VTTBuilder.h
  565. ./include/clang/AST/UnresolvedSet.h
  566. ./include/clang/AST/DeclCXX.h
  567. ./include/clang/AST/GlobalDecl.h
  568. ./include/clang/AST/ParentMap.h
  569. ./include/clang/AST/StmtCXX.h
  570. ./include/clang/AST/DeclBase.h
  571. ./include/clang/AST/AttrVisitor.inc
  572. ./include/clang/AST/CharUnits.h
  573. ./include/clang/AST/ExprOpenMP.h
  574. ./include/clang/AST/RawCommentList.h
  575. ./include/clang/AST/LambdaCapture.h
  576. ./include/clang/AST/OperationKinds.def
  577. ./include/clang/AST/TypeVisitor.h
  578. ./include/clang/AST/DeclOpenMP.h
  579. ./include/clang/AST/OpenMPClause.h
  580. ./include/clang/AST/ASTTypeTraits.h
  581. ./include/clang/AST/RecursiveASTVisitor.h
  582. ./include/clang/AST/ExternalASTSource.h
  583. ./include/clang/AST/Type.h
  584. ./include/clang/AST/PrettyPrinter.h
  585. ./include/clang/AST/DeclVisitor.h
  586. ./include/clang/AST/AST.h
  587. ./include/clang/AST/DeclNodes.inc
  588. ./include/clang/AST/CanonicalType.h
  589. ./include/clang/AST/Comment.h
  590. ./include/clang/AST/CommentHTMLTagsProperties.inc
  591. ./include/clang/AST/ExternalASTMerger.h
  592. ./include/clang/AST/Mangle.h
  593. ./include/clang/AST/AttrIterator.h
  594. ./include/clang/AST/CommentSema.h
  595. ./include/clang/AST/AttrDump.inc
  596. ./include/clang/AST/DependentDiagnostic.h
  597. ./include/clang/AST/DeclContextInternals.h
  598. ./include/clang/AST/APValue.h
  599. ./include/clang/AST/DeclLookups.h
  600. ./include/clang/AST/Decl.h
  601. ./include/clang/AST/Expr.h
  602. ./include/clang/AST/DeclFriend.h
  603. ./include/clang/AST/StmtObjC.h
  604. ./include/clang/AST/ODRHash.h
  605. ./include/clang/AST/TypeLocVisitor.h
  606. ./include/clang/ASTMatchers
  607. ./include/clang/ASTMatchers/ASTMatchers.h
  608. ./include/clang/ASTMatchers/ASTMatchFinder.h
  609. ./include/clang/ASTMatchers/ASTMatchersInternal.h
  610. ./include/clang/ASTMatchers/ASTMatchersMacros.h
  611. ./include/clang/ASTMatchers/Dynamic
  612. ./include/clang/ASTMatchers/Dynamic/Registry.h
  613. ./include/clang/ASTMatchers/Dynamic/VariantValue.h
  614. ./include/clang/ASTMatchers/Dynamic/Diagnostics.h
  615. ./include/clang/ASTMatchers/Dynamic/Parser.h
  616. ./include/clang/Edit
  617. ./include/clang/Edit/Rewriters.h
  618. ./include/clang/Edit/EditedSource.h
  619. ./include/clang/Edit/EditsReceiver.h
  620. ./include/clang/Edit/Commit.h
  621. ./include/clang/Edit/FileOffset.h
  622. ./include/clang/Driver
  623. ./include/clang/Driver/Driver.h
  624. ./include/clang/Driver/Compilation.h
  625. ./include/clang/Driver/DriverDiagnostic.h
  626. ./include/clang/Driver/Types.h
  627. ./include/clang/Driver/Phases.h
  628. ./include/clang/Driver/SanitizerArgs.h
  629. ./include/clang/Driver/Job.h
  630. ./include/clang/Driver/Util.h
  631. ./include/clang/Driver/Types.def
  632. ./include/clang/Driver/Options.h
  633. ./include/clang/Driver/Action.h
  634. ./include/clang/Driver/Multilib.h
  635. ./include/clang/Driver/XRayArgs.h
  636. ./include/clang/Driver/Distro.h
  637. ./include/clang/Driver/Tool.h
  638. ./include/clang/Driver/Options.inc
  639. ./include/clang/Driver/ToolChain.h
  640. ./include/clang/Rewrite
  641. ./include/clang/Rewrite/Core
  642. ./include/clang/Rewrite/Core/HTMLRewrite.h
  643. ./include/clang/Rewrite/Core/DeltaTree.h
  644. ./include/clang/Rewrite/Core/RewriteBuffer.h
  645. ./include/clang/Rewrite/Core/TokenRewriter.h
  646. ./include/clang/Rewrite/Core/RewriteRope.h
  647. ./include/clang/Rewrite/Core/Rewriter.h
  648. ./include/clang/Rewrite/Frontend
  649. ./include/clang/Rewrite/Frontend/ASTConsumers.h
  650. ./include/clang/Rewrite/Frontend/Rewriters.h
  651. ./include/clang/Rewrite/Frontend/FrontendActions.h
  652. ./include/clang/Rewrite/Frontend/FixItRewriter.h
  653. ./include/cling
  654. ./include/cling/MetaProcessor
  655. ./include/cling/MetaProcessor/MetaProcessor.h
  656. ./include/cling/Utils
  657. ./include/cling/Utils/Output.h
  658. ./include/cling/Utils/UTF8.h
  659. ./include/cling/Utils/Paths.h
  660. ./include/cling/Utils/Platform.h
  661. ./include/cling/Utils/ParserStateRAII.h
  662. ./include/cling/Utils/Casting.h
  663. ./include/cling/Utils/SourceNormalization.h
  664. ./include/cling/Utils/Diagnostics.h
  665. ./include/cling/Utils/AST.h
  666. ./include/cling/Utils/Validation.h
  667. ./include/cling/Utils/OrderedMap.h
  668. ./include/cling/UserInterface
  669. ./include/cling/UserInterface/UserInterface.h
  670. ./include/cling/UserInterface/textinput
  671. ./include/cling/UserInterface/textinput/InputData.h
  672. ./include/cling/UserInterface/textinput/KeyBinding.h
  673. ./include/cling/UserInterface/textinput/StreamReader.h
  674. ./include/cling/UserInterface/textinput/SignalHandler.h
  675. ./include/cling/UserInterface/textinput/Color.h
  676. ./include/cling/UserInterface/textinput/TerminalDisplay.h
  677. ./include/cling/UserInterface/textinput/Range.h
  678. ./include/cling/UserInterface/textinput/TerminalConfigUnix.h
  679. ./include/cling/UserInterface/textinput/TerminalDisplayWin.h
  680. ./include/cling/UserInterface/textinput/StreamReaderWin.h
  681. ./include/cling/UserInterface/textinput/TerminalDisplayUnix.h
  682. ./include/cling/UserInterface/textinput/Display.h
  683. ./include/cling/UserInterface/textinput/StreamReaderUnix.h
  684. ./include/cling/UserInterface/textinput/TextInputContext.h
  685. ./include/cling/UserInterface/textinput/Reader.h
  686. ./include/cling/UserInterface/textinput/Callbacks.h
  687. ./include/cling/UserInterface/textinput/History.h
  688. ./include/cling/UserInterface/textinput/TextInput.h
  689. ./include/cling/UserInterface/textinput/Editor.h
  690. ./include/cling/UserInterface/textinput/Text.h
  691. ./include/cling/cint
  692. ./include/cling/Interpreter
  693. ./include/cling/Interpreter/CIFactory.h
  694. ./include/cling/Interpreter/Transaction.h
  695. ./include/cling/Interpreter/Exception.h
  696. ./include/cling/Interpreter/RuntimeUniverse.h
  697. ./include/cling/Interpreter/ClangInternalState.h
  698. ./include/cling/Interpreter/InterpreterCallbacks.h
  699. ./include/cling/Interpreter/RuntimePrintValue.h
  700. ./include/cling/Interpreter/ClingCodeCompleteConsumer.h
  701. ./include/cling/Interpreter/ClingOptions.h
  702. ./include/cling/Interpreter/DynamicLookupLifetimeHandler.h
  703. ./include/cling/Interpreter/AutoloadCallback.h
  704. ./include/cling/Interpreter/Value.h
  705. ./include/cling/Interpreter/DynamicLookupRuntimeUniverse.h
  706. ./include/cling/Interpreter/CompilationOptions.h
  707. ./include/cling/Interpreter/Interpreter.h
  708. ./include/cling/Interpreter/DynamicExprInfo.h
  709. ./include/cling/Interpreter/InvocationOptions.h
  710. ./include/cling/Interpreter/DynamicLibraryManager.h
  711. ./include/cling/Interpreter/LookupHelper.h
  712. ./include/cling/Interpreter/CValuePrinter.h
复制代码
gen_deb.sh
  1. #!/bin/bash

  2. old_prefix=/home/user/inst/
  3. prefix=/opt/cish/
  4. work_dir=./cish


  5. #copy compilied  files
  6. mkdir -p cish
  7. for file in `cat list.txt`
  8. do
  9. if [ -d $old_prefix/$file ]
  10. then
  11. mkdir -p $work_dir/$prefix/$file
  12. else
  13. cp $old_prefix/$file $work_dir/$prefix/$file
  14. fi
  15. done

  16. #copy user file
  17. mkdir -p $work_dir/$prefix/user/
  18. cat ~/.cishrc >> $work_dir/$prefix/user/.cishrc

  19. #create script
  20. mkdir -p  $work_dir/usr/local/bin/
  21. echo '#~/bin/sh' >> $work_dir/usr/local/bin/cish
  22. echo prefix=$prefix >> $work_dir/usr/local/bin/cish
  23. cat cish.script>> $work_dir/usr/local/bin/cish
  24. chmod +x $work_dir/usr/local/bin/cish

  25. #copy deb config file
  26. cp -r ./DEBIAN $work_dir/

  27. #build deb
  28. dpkg -b $work_dir

  29. #clean
  30. rm -rf $work_dir
复制代码
DEBIAN/control
  1. Package: cish
  2. Version:0.6-dev-beta
  3. Priority: optional
  4. Depends:libc6,libgcc1
  5. Architecture: amd64
  6. Maintainer: cish
  7. Description: Test cish
复制代码
cish.scipt
  1. PATH=$prefix/bin:$PATH

  2. if [ -e ~/.cishrc ]
  3. then
  4. echo  
  5. else
  6. cp $prefix/user/.cishrc ~/.cishrc
  7. fi

  8. cling $@
复制代码



作者: 不点    时间: 2018-4-6 05:00
关于 ACL,搜到如下网页,是个入门的好材料,希望对 wintoflash 有用:

Linux 学习记录--ACL 权限控制
http://wiki.jikexueyuan.com/proj ... ission-control.html


作者: 不点    时间: 2018-4-6 10:48
本帖最后由 不点 于 2018-4-6 11:36 编辑

前面我找到了 tiny shell 即 tsh.c,目前已经试着整合到 cish 当中了。它具有 job control 功能。但是,接着又发现一个更好的 shell —— ladsh —— 非常棒!几乎囊括了一个完整 shell 应有的全部内容。现在就准备撤掉 tsh,换上 ladsh。

注意,新旧版本的区别:
这是新版本:http://www.danlj.org/lad/lad2src.tar.gz
这是旧版本:http://www.danlj.org/lad/src/ladsrc.tar.gz

搜 ladsh shell 以及 ladsh1.c 可以找到相关网页:

http://www.danlj.org/lad/
http://www.danlj.org/lad/src/
http://www.danlj.org/lad/src/ladsh1.c.html
https://github.com/jivoi/junk/tree/master/linux_app_dev_troan
https://lxr.missinglinkelectronics.com/busybox/shell/hush.c

ladsh.c 是 public domain 授权。有了它,cish 的开发进度会大大加快。


作者: 2013olly    时间: 2018-4-7 09:16
不点 发表于 2018-4-6 10:48
前面我找到了 tiny shell 即 tsh.c,目前已经试着整合到 cish 当中了。它具有 job control 功能。但是,接 ...

既然需要更多的功能,为何没有考虑直接整合bash呢
作者: 不点    时间: 2018-4-7 12:09
本帖最后由 不点 于 2018-4-13 07:11 编辑
2013olly 发表于 2018-4-7 09:16
既然需要更多的功能,为何没有考虑直接整合bash呢


去年首先尝试整合 zsh,失败后又尝试整合 bash,再次失败后,又尝试整合 dash,居然也失败了。前后经历有半年之多。再一再二再三失败后,才决定自己从头摸索。从头摸索的坏处是耗时,可能需要很多年;好处是心里踏实,不会再有高深莫测、故意让人看不懂的代码了。还有一个好处是,逼着自己学习操作系统的进程模型、信号控制等知识,让自己能够比原先更深入地了解操作系统内幕。在摸索的过程中,发现有很多 “好东西”,属于 “良好教材” 的性质。把这些东西收集起来,除了能够直接帮助开发 shell 以外,还可以当成普通教材,有利于其他项目或其他目标、任务。





以上是 “不痛不痒”、“不得罪人” 的公开内容。下面说点私密内容,有可能得罪人,但可以让各位了解我的真实想法。

在企图整合 zsh、bash、dash 失败之后,我对这三个 shell 印象很不好。在它们 “强大” 的背后,我极其担心它们隐藏大量后门。我没有直接证据,只是一种直觉。不用每次都声明,上述判断代表我个人的 “真理观”。这是废话,因为每个人说的每句话都是代表他自己的 “真理观” 的,不代表 “普世真理”。好的,就说这么多,其实已经够多了,再多说就可能又要说废话了。

作者: 不点    时间: 2018-4-7 14:37
Show All Running Processes in Linux
https://www.cyberciti.biz/faq/show-all-running-processes-in-linux/

作者: 不点    时间: 2018-4-7 14:59
ladsh 的 4 个版本中,第一版是最简单的,只有 job control,没有 “管道” 以及 “I/O 重定向”。ladsh 分成逐步展开的 4 个版本(ladsh1、ladsh2、ladsh3、ladsh4),这真是太好了——它真是个好教材!第一版最重要,它具有 job control 功能。这好像是最难、最复杂的工作了。因此我也准备首先实现 job control。

我准备尝试用 “纯进程控制” 的方式对其 job control 的逻辑设计进行简化,不知道这个思路能否顺利实现,需要一些时日。

作者: 不点    时间: 2018-4-9 11:32
下面这个英文帖子讲了 proc 和 sys 的区别,以及来龙去脉。尤其是讲了,进程信息仍然留在 proc 当中,不像是要挪到 sys 里面的样子。在别的地方看到有人说 “proc 过时了,已经被 sys 取代了”,这是误导。澄清了这一点,我们就可以放心地用 proc 来处理进程信息、实现作业控制了。不过,proc 也有 “不兼容性” 的弱点 —— 非 Linux 的操作系统有可能不支持 proc。某些早期的 BSD 支持 proc,但后来不再支持了。然而,我没打算支持 BSD;我只打算支持 Linux。因此,这就不算是个问题了。

What is the difference between procfs and sysfs?
作者: 不点    时间: 2018-4-12 13:59
前些日子整合了具有 “job control” 的 tsh。然而,它运行的 child 好像没有正确收养,而成为孤儿。

本次实现了后台运行 child(用命令结尾的 “&” 来表示后台运行),但没有 “job control”(即,没有 fg、bg、jobs 等命令)。试试看,会不会有 “孤儿” 或 “僵尸” 出现?

作者: 不点    时间: 2018-4-14 07:28
学习线程知识,找到这本书:

Modern Operating Systems (3rd Edition)
https://www.amazon.com/dp/0136006639/?tag=stackoverflow17-20

作者: 不点    时间: 2018-4-14 15:25
本帖最后由 不点 于 2018-4-15 10:50 编辑

今天试验了一下,可以用 C 语句来实现 “后台执行某个 C 语句块”:

  1. if (pid_t cpid = fork ()) { if (cpid == -1) {perror("fork");return 1;} return 0;} else for (;;exit(0)){ for (;;){sleep(5); puts("OK");} }
复制代码


上述语句很长,但只有结尾处的这个语句块是我们想要在后台执行的:

  1. { for (;;){sleep(5); puts("OK");} }
复制代码


而它前面的一长串代码:

  1. if (pid_t cpid = fork ()) { if (cpid == -1) {perror("fork");return 1;} return 0;} else for (;;exit(0))
复制代码


可以看成只不过是个 “前缀” 罢了。如果把这个前缀定义成某个宏,比如就叫做 bg:

  1. #define bg if (pid_t cpid = fork ()) { if (cpid == -1) {perror("fork");return 1;} return 0;} else for (;;exit(0))
复制代码


那么,本帖开头的那个长语句就可以简化了:

  1. bg { for (;;){sleep(5); puts("OK");} }
复制代码







【更新】bg 命令已经被 bash 等 shell 使用。因此换成 “cb”(意思是 Child in Background)。cish 启动时,已经自动添加如下宏定义:

  1. #define cb if (pid_t cpid = fork ()) { if (cpid == -1) perror("fork");} else for (;;exit(0))
复制代码
  1. #define cf if (pid_t cpid = fork ()) { int status; if (cpid == -1) {perror("fork"); 1;} else if (-1 == waitpid(cpid, &status, 0)) {perror("waitpid"); 1;} else status;} else for (;;exit(0))
复制代码


其中 cf 是 “在前台启动子进程” 的意思。注意区别:当不使用 cf 时,是在当前进程中运行 C 语句块。当使用 cf 时,是在子进程(即子 shell)中运行 C 语句块。

cb 和 cf 的共同点是,它们都要启动子 shell。不同之处是,cf 在前台运行子 shell,因而需要等到子 shell 结束后才能继续运行后续的语句。cb 是在后台运行子 shell,无需等待子 shell 结束,紧接着立即执行当前进程中的后续语句。

要想在后台子 shell 中运行某个语句块 {...},只需在其前面添加 cb 即可。举例:


  1. cb { for (;;){sleep(5); puts("OK");} }
复制代码


要想在前台子 shell 中运行某个语句块 {...},只需在其前面添加 cf 即可。举例:

  1. cf { for (int i=0; i<100; i++){sleep(1); printf("%d ", i); fflush(stdout);} }
复制代码


后台运行的子进程,如果在父进程(也就是当前 shell)结束之前就结束(终止、死)了,那么父进程会为子进程正确地 “收尸”。父进程每次执行一个新命令时,就要检查是否有子进程退出(死掉),并为死去的子进程收尸。但如果子进程在父进程结束之后还活着,则它将成为 “孤儿”,Linux 内核会让 init 进程 “收养” 它,并在它死去时为它收尸。
作者: 不点    时间: 2018-4-15 13:30
发现 cling 支持 asm。试试 nop 指令,没有报错。而用一条不存在的 nopp 指令来试验,则报错。这说明 asm 能够正常工作。
  1. user@ttyd:~$ cish
  2. [cling]$ asm("nop");
  3. [cling]% asm("nopp");
  4. <inline asm>:1:2: error: invalid instruction mnemonic 'nopp'
  5.         nopp
  6.         ^~~~
  7. [cling]%
复制代码


作者: gnuxwy    时间: 2018-4-15 21:13
嗯,又来看不点大师的进展了,祝贺大师的找到了更合适的ladsh参考。。。

屮也觉得不必要拘泥于posix兼容,如果cish基本只在gnux平台上用,就用不着考考虑其他方面。
而且小而专的软件其实也挺好的,比如busybox这个实用工具,在嵌入式领域应用很广,典型的小而精。

不点大师搞cish,如果成熟了,作为教学shell就很不错。
既可在教学中示例写点C程序范例,又可示范学习使用shell的一些基本功能。。。






作者: 不点    时间: 2018-4-19 10:20
前台进程,会话,控制终端,用户的关系
原创 2015年02月15日 16:57:24 https://blog.csdn.net/codinghonor/article/details/43836211

1、一个会话和一个控制终端一一对应
2、一个控制终端对应一个前台进程组
3、一个会话拥有一个前台进程组和若干后台进程组
4、会话中的所有进程都对应同一个控制终端
5、只有前台进程可以 read write 控制终端
6、控制终端收到一些特殊的信号字符,会发送相应的信号给前台进程组的进程
7、控制终端退出或者控制进程的退出,会发送
SIGHUP 信号给前台进程组

完整场景: 用户通过终端登录时,login shell 成为会话 leader 和控制进程,该终端被设置成为控制终端;login shell 是该会话的唯一进程,在该终端中执行命令,会将命令中的进程放入一个新的进程组(前台or后台)执行;当终端关闭时,内核发送 SIGHUP 给控制进程,即 login shell, login shell 发送 SIGHUP 给由 login shell 创建的所有进程组,如果 login shell 控制进程退出,则 kernel 发送
SIGHUP 给前台进程组中的所有进程(支持作业的情况下,也会发给后台进程组中的所有进程),SIGHUP 的默认动作是终止进程,所以 login shell 和相应的子进程都终止,控制终端和会话的映射关系解除。



作者: 不点    时间: 2018-4-19 11:35
前台进程就是用户使用的有控制终端的进程

进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

https://lesca.me/archives/process-relationship.html
作者: 不点    时间: 2018-4-20 18:41
是的,我一直在想,jobs、fg、bg 等作业控制命令,能否用外部命令来实现。就是说,不把 “作业控制” 当作 shell 的特色,而是当作操作系统(进程控制)中的一项固有功能。

假如 jobs、fg、bg 可以用外部命令实现的话,那它们就不该用内部命令来实现。为什么?因为权衡。那些使用频率很低的命令,不该占用 shell 的常驻内存资源,或者增加 shell 可执行文件的大小。

作者: 不点    时间: 2018-4-21 14:01
本帖最后由 不点 于 2018-4-21 16:26 编辑

下面这个网页讲述 nohup、disown 等知识,非常透彻,质量高。
https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

从上述网页了解到,正是由于 shell 在退出时向各个 jobs 发送 HUP 信号,才导致子进程退出的。如果 shell 不发送 HUP 信号,那么子进程就不会自动退出。

我觉得,是 shell 本身把这个问题复杂化了。

这不符合 unix 崇尚简单的理念。干一件事,只干这一件事,不要附带干很多事。干的事越多,水搅得就越浑,把本来简单的东西,一下子就派生出一堆复杂问题去处理,属于没事找事的范畴。

顺便谈谈对于 setuid 的看法。为了让 passwd 能够写入 shadow 之类的文件,就发明了 setuid 位,让用户能够更改身份,制造出一个巨大的漏洞,至少是个隐患,需要经常修补。

另一方面,真正需要强化和完善的地方,却又不作为。比如,rwx 这个权限设计过于简单,后来用 ACL 来打补丁,却不从系统层面直接加强 rwx 的设计逻辑。




作者: 不知    时间: 2018-4-21 18:14
不点 发表于 2018-4-21 14:01
下面这个网页讲述 nohup、disown 等知识,非常透彻,质量高。
https://unix.stackexchange.com/questions/ ...

suid位确实有存在的必要,毕竟linux只是系统内核,如果没有suid位,应用就不能提权,只能降权,不方便使用(除非像windows那样留一个高权限的后台进程来提权)。而且suid位可通过文件系统的nosuid选项禁止,也不算太复杂,只要root用户不乱改,现在的发行版linux一般不会出现大的suid漏洞。文件系统的rwx设计的确有些简单。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3