有人可能会说一些关于异常的事情......但是在C中,有什么其他方法可以干净利落地清楚地完成以下操作并且不需要重复这么多代码?
if (Do1()) { printf("Failed 1"); return 1; }
if (Do2()) { Undo1(); printf("Failed 2"); return 2; }
if (Do3()) { Undo2(); Undo1(); printf("Failed 3"); return 3; }
if (Do4()) { Undo3(); Undo2(); Undo1(); printf("Failed 4"); return 4; }
if (Do5()) { Undo4(); Undo3(); Undo2(); Undo1(); printf("Failed 5"); return 5; }
Etc...
Run Code Online (Sandbox Code Playgroud)
这可能是使用gotos的一种情况.或者可能是多个内部功能......
是的,之前已经问过这个问题,但是阅读答案并没有给我带来太多启发.
我写了一个C程序,在使用几天后崩溃了.重要的一点是它不会生成核心文件,即使所有内容都已设置好(core_pattern,ulimit -c unlimited等等)我可以使用kill -SIGQUIT触发核心转储.
程序会广泛记录它的功能,但是没有关于日志崩溃的提示.崩溃时(或之前?)显示的唯一消息是:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 2322 requests (2322 known processed) with 0 events remaining.
Run Code Online (Sandbox Code Playgroud)
所以有两个问题: - 如果没有核心转储,程序如何崩溃(返回$?= 1)是可能的. - 这是什么错误信息,我该怎么办?
系统是RedHat Enterprise 6.4
编辑:我设法通过从atexit()回调中调用abort()来强制进行核心转储:
(gdb) bt
#0 0x00bc8424 in __kernel_vsyscall ()
#1 0x0085a861 in raise () from /lib/libc.so.6
#2 0x0085c13a in abort () from /lib/libc.so.6
#3 0x0808f5cf in Unexpected () at MyCode.c:1378
#4 0x0085de9f in exit () from /lib/libc.so.6
#5 0x00c85701 in _XDefaultIOError () from /usr/lib/libX11.so.6 …Run Code Online (Sandbox Code Playgroud) 我知道如何在其中运行一个可执行文件来启动Konsole,并在程序结束后保持Konsole打开.我可以使用.desktop文件执行此操作并更改其中的一些选项.
但是我想更进一步,推出一个打开多个标签的KDE konsole,每个标签都运行一个特定的程序,当程序完成时它会保持打开并给你一个提示.
Konsole没有手册页,所以我甚至不知道它可以采取什么选择.还是一些d-bus电话?谢谢
有没有办法使用grep进行重音不敏感搜索,最好保留--color选项?通过这个我的意思grep --secret-accent-insensitive-option aei是匹配àei,但也äēì和可能æi.
我知道我可以iconv -t ASCII//TRANSLIT用来删除文本中的重音,但我不知道如何使用它来匹配文本被转换(它适用于grep -c或-l)
我想做这样的事情:
COMMANDS='"ls /" "df ~" "du -hs ~/Devel/"'
for i in $COMMANDS; do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
结果如下:
ls /
df ~
du -hs ~/Devel/
Run Code Online (Sandbox Code Playgroud)
但我找不到合适的空格语法.
假设我有一个用不寻常的位数编码的有符号数,例如 12。如何将其有效地转换为标准 C 值?以下方法有效,但需要一个中间变量:
#include <stdio.h>
int main() {
unsigned short U12=0xFFF; // 12-bit signed number, as coded in hex
unsigned short XT=U12<<4; // 16 bits minus 12 is 4...
short SX=(*(short*)&XT)>>4; // Signed shift. Is that standard C ?
printf("%08X %d\n", SX, SX);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
U12=0x0: 00000000 0
U12=0x1: 00000001 1
U12=0x7FF: 000007FF 2047
U12=0x800: FFFFF800 -2048
U12=0x801: FFFFF801 -2047
U12=0xFFF: FFFFFFFF -1
Run Code Online (Sandbox Code Playgroud)
有没有更直接的方法来做到这一点而无需中间变量?
显然,其中一个旧修订版已从svn存储库中消失:
svn checkout http... myrepo
svn: REPORT of '/svn/myrepo/!svn/vcc/default': Could not read chunk size: connection was closed by server (http://localhost)
Run Code Online (Sandbox Code Playgroud)
$ svnadmin verify myrepo
* Verified revision 0.
...
svnadmin: No such revision 262
$ svn log -v -r 262
svn: No such revision 262
$ ll /var/SVN/myrepo/db/revs/0/
...
-rw-r--r-- 1 www-data www-data 27289777 2010-10-21 22:21 260
-rw-r--r-- 1 www-data www-data 4727180 2010-11-12 18:51 261
-rw-r--r-- 1 www-data www-data 2180586 2010-11-14 20:33 263
...
Run Code Online (Sandbox Code Playgroud)
搜索该问题时说“从备份还原”,但是我所有的3个备份都缺少此修订版,因此它一定已经进行了一段时间。我只有在无法提交特定文件时才注意到它。我有一个当前的工作副本。除了从头开始,我还能做什么?
我编译了一个 C 程序,-O0 -Wall然后使用-O1, -O2,-O3我收到了不同的警告消息,其中一些实际上非常重要,以至于它们显示了实际的错误(例如,返回一个本地字符串而不是-O1IIRC 中的静态字符串的函数)。
这是为什么 ?我能得到更多警告吗?
长期以来,我一直在寻找一种解决方案,以隧道连接到防火墙后的计算机,使VNC(或其他端口)通过。就像在这个旧的usenet帖子中所解释的那样,我将在这里进行回顾:
我必须通过中间机器登录,例如:
local $ ssh interim
interim $ ssh remote
remote $ ...any commands...
Run Code Online (Sandbox Code Playgroud)
这很好。但是现在我试图通过一个远程步骤将vnc会话从远程隧道传输到本地,但我找不到魔咒。
假设我有一个带有许多参数的printf:
printf("%d %d %d %d", A, B, C, D);
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我希望不再打印一个参数,但仍将其列在参数列表中(例如,出于视觉原因,或者可能是带有必要副作用的函数调用等)。
我可以用无输出的转换字母替换%d吗?我不记得有这样一封转换信。或者也许正在玩旗帜...?
[编辑]我刚刚注意到scanf有类似的东西(但是相反):分配抑制标志'*'。例如sscanf("123 345 678", "%i %*i %i", &a, &b)将导致a = 123 b = 678