【问题标题】:Sleep() returns early in xcodeSleep() 在 xcode 中提前返回
【发布时间】:2014-07-27 09:38:48
【问题描述】:

如果我在 xcode 中运行这段代码,子进程退出时睡眠仅 1 秒后返回;但是当我在终端中制作并运行这段代码时,它会睡眠 10 秒;为什么??

int main(int argc, const char * argv[])
{
  pid_t pid;
  if ((pid = fork()) ==0) {
      sleep(1);
  }else{
      sleep(10);
      printf("hello");
  }
 return 0;
}

【问题讨论】:

    标签: xcode unix


    【解决方案1】:

    如果您检查睡眠的返回代码,您会看到它返回 -1 并将 errno 设置为 EINTR

    如果您需要使用something akin to sleep,请参阅我发布的解决此问题的答案。

    【讨论】:

    • 我真正的问题是:我在 xcode 和终端中运行的相同代码显示不同的结果。为什么?我猜 xcode 中的某些设置会导致这种情况,但我想知道它是什么。
    • 调试器有干扰。您必须改用while (nanosleep(...)) 技巧。如果您在启动过程的早期将睡眠置于您的进程中,这是您必须解决的 Mac 行为。如果您只是在命令行中运行lldb 下的程序,您将看到相同的行为
    【解决方案2】:

    函数sleep 将休眠所需的秒数或直到向进程发送信号。 (man sleep)

    在这种情况下,信号SIG_CHLD 正在发送到您的程序。 SIG_CHLD 是代表子进程终止的信号。

    要忽略信号,只需添加:

    signal(SIGCHLD, SIG_IGN);
    

    别忘了包括#include<signal.h>

    添加此行使程序在我的 Mac 上正确执行。

    如需更详细的答案,请参阅此帖子:https://stackoverflow.com/a/7171836/947321

    【讨论】:

    • 您没有理解我的问题,并且您的代码在我的 xcode 中不起作用。 1. SIGCHLD 默认设置为 SIG_IGN ,你不需要 signal(SIGCHLD, SIG_IGN) ; 2.即使您设置了信号(SIGCHLD,SIG_IGN),我在 xcode 中的代码仍然无法正常工作。我真正的问题是:我在 xcode 和终端中运行的相同代码显示不同的结果。为什么?我猜 xcode 中的某些设置会导致这种情况,但我想知道是什么是吗。
    • 我正在使用 Xcode 版本 5.1.1 (5B1008) 和 pastebin.com/9J0wUBBw 就像一个魅力。并且不同的行为应该是由附加的调试器引起的,不过我不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2016-10-19
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多