相关疑难解决方法(0)

233
推荐指数
4
解决办法
33万
查看次数

从控制台应用程序退出的正确方法

我已经在这里阅读了一些内容,在这里我仍然对是否应该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# console-application

6
推荐指数
1
解决办法
5万
查看次数

调试时为什么生成的程序退出代码会发生变化?

我有一个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)

c c++ linux assert exit-code

4
推荐指数
1
解决办法
1538
查看次数

如何使用ENOSYS阻止sem_open()失败?

我有两个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)

c linux posix semaphore ipc

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

c ×2

c# ×2

console-application ×2

linux ×2

assert ×1

c++ ×1

exit ×1

exit-code ×1

ipc ×1

posix ×1

semaphore ×1