我认为他们应该基本相同,但是当我尝试时
$ git stash show -p stash@{N}
Run Code Online (Sandbox Code Playgroud)
和
$ git show stash@{N}
Run Code Online (Sandbox Code Playgroud)
后者显示了一些额外的提交信息,但实际的差异要短得多.(前者显示了大约十二个文件,但后者只有一个.)
那么,两者之间究竟有什么区别,为什么它们不同?
我还可以依赖于git diff stash@{M} stash@{N}正确的事情吗?
我正在调试一个程序,该程序重复fork()使用子进程执行某些委托任务的典型过程,因为父进程调用waitpid()等待子进程完成,然后继续。例如:
while (!finished) {\n pid_t p = fork();\n if (p < 0) {\n perror("fork");\n exit(EXIT_FAILURE);\n }\n else if (p == 0) {\n /* Do something. For example: */\n if (/* some (rare) condition */) \n raise(SIGSEGV);\n exit(EXIT_SUCCESS);\n }\n else {\n int status;\n pid_t w = waitpid(p, &status, 0);\n if (w < 0) {\n perror("waitpid");\n exit(EXIT_FAILURE);\n }\n /* Do something. */\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我想在 GDB 中运行该程序并调试接收信号的子进程,无论有多少其他子进程在它之前成功完成并消失。
\n\n当然,我需要set follow-fork-mode child,因为否则 GDB …
如果我跑
$#/bin/bash
for i in `seq 5`; do
exec 3> >(sed -e "s/^/$i: /"; echo "$i-")
echo foo >&3
echo bar >&3
exec 3>&-
done
Run Code Online (Sandbox Code Playgroud)
那么结果是不同步的;它可能是这样的:
1: foo
1: bar
2: foo
2: bar
1-
3: foo
3: bar
2-
3-
4: foo
5: foo
4: bar
5: bar
4-
5-
Run Code Online (Sandbox Code Playgroud)
>(...)在进行下一次迭代之前,如何确保流程替换已完成?
sleep 0.1在exec 3>&-帮助之后插入,但它不优雅,效率低下,并且不能保证总是有效。
编辑:这个例子可能看起来很傻,但它只是为了说明。我正在做的是在循环中读取输入流,将每一行提供给一个在循环中偶尔会改变的进程。在代码中更容易解释:
# again, simplified for illustration
while IFS= read line; do
case $line in
@*)
exec 3>&-
filename=${line:1}
echo "starting $filename" …Run Code Online (Sandbox Code Playgroud) 我想要一个类似字典的类,它在查找时透明地使用转换后的键,以便我可以编写
k in d # instead of f(k) in d
d[k] # instead of d[f(k)]
d.get(k, v) # instead of d.get(f(k), v)
Run Code Online (Sandbox Code Playgroud)
等等(例如,想象一下f进行某种规范化,例如f(k)返回k.lower()。)
似乎我可以继承dict并覆盖各个操作,但并不是有一个集中位置来进行所有键都经过的这种转换。这意味着我必须覆盖所有__contains__、__getitem__、get和可能的__missing__等。这变得太乏味且容易出错,并且不是很有吸引力,除非这种开销超过手动替换f(k)普通 上的每个调用的开销dict。