我已经在这里阅读了一些内容,在这里我仍然对是否应该Enviorment.Exit()在控制台应用程序中使用感到困惑。
在一种方法中,如果用户在提示符下键入 exit,我有以下代码,
if(userSelect == "exit")
{
Environment.Exit(0);
}
Run Code Online (Sandbox Code Playgroud)
更新:
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Welcome to my Console App");
Console.WriteLine();
consoleManager();
}
public static void consoleManager()
{
string consolePrompt = "ConsoleApp\">";
string whichMethod = "";
Console.Write(consolePrompt);
whichMethod = Console.ReadLine();
if(whichMethod == "view enties")
{
viewEntry();
}
else
if(whichMethod == "Add Entry")
{
addEntry();
}
else
if(whichMethod == "exit")
{
//what to do here
}
else
{
help();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个C++程序,我用来测试另一个程序不会崩溃.父代码(我们称之为'parentProg')看起来像这样:
int run(const char * command)
{
...
int retCode = system(command);
printf("Code is %d\n",retCode);
if(retCode == 134) //128 + SIGABORT
{
// Record error conditions
...
}
}
Run Code Online (Sandbox Code Playgroud)
命令变量包含正在测试的程序(我们称之为'childProg').使用以前的Linux发行版,此代码按预期工作.如果a.out崩溃或命中一个断言,它将返回134并且错误处理代码将运行.但是,在我升级到更新的Linux发行版后,情况就不再如此了.相反,当使用GDB或nemiver作为衍生程序运行时,我看到返回代码为6.奇怪的是,如果我单独运行子程序或使用DDD,它将恢复到134.
对于以下测试,我将childProg修改为仅以下代码:
#include <assert.h>
int main(int argc, char * argv[])
{
assert(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
childProg本身
[user@localhost multi]$ ./childProg
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Abort
[user@localhost multi]$ echo $?
134
Run Code Online (Sandbox Code Playgroud)
parentProg产生childProg
[user@localhost multi]$ ./parentProg 1 o
Running 1 times
childProg: temp.cpp:5: int main(int, char **): Assertion `0' …Run Code Online (Sandbox Code Playgroud) 我有两个Slackware Linux系统,POSIX信号量sem_open()调用失败,errno设置为38.示例代码重现如下(代码在CentOS/RedHat上运行正常).
是否有可能导致此问题的内核或系统配置选项?其他建议?
有问题的系统是Slackware 10.1.0内核2.6.11 /lib/librt-2.3.4.so /lib/libpthread-0.10.so,但相同的代码适用于更旧的RedHat 9内核2.4.20/lib/librt -2.3.2.so /lib/tls/libpthread-0.29.so.(也适用于CentOS 5内核2.6.18 /lib/librt-2.5.so /lib/i686/nosegneg/libpthread-2.5.so).
man sem_open表明sem_open()系统不支持此错误方式.
#define ENOSYS 38 /* Function not implemented */
Run Code Online (Sandbox Code Playgroud)
在sem_open()用户空间是librt我们对动态链接和librt存在受影响的系统.
受影响的系统声称支持POSIX信号量:_POSIX_SEMAPHORES是真的并sysconf(_SC_SEMAPHORES)确认了这一点.
谢谢,基兰
编辑1:我已经在使用的软件版本中添加了更多细节,并删除了一些不相关的评论.
编辑2:/ dev/shm安装在良好的系统上,而不是安装在坏系统上.挂载它不会改变受影响系统上的行为.我认为/ dev/shm也是必要的,但sem_open()在此之前就失败了,strace支持这个.
# /* Quick'n'dirty test program to illustrate sem_open failure
#Run this file to auto-build test and run as a.out
# Build
gcc $0 -lrt
if [ $? -ne 0 ] ; then exit ; fi …Run Code Online (Sandbox Code Playgroud)