如何在 C 中正确使用“sleep()”系统调用

Posted

技术标签:

【中文标题】如何在 C 中正确使用“sleep()”系统调用【英文标题】:How to correctly use the 'sleep()' system call in C 【发布时间】:2021-06-15 06:46:24 【问题描述】:

我的任务是编写一个 C 程序,它允许子代码使用 sleep 命令在父代码之后完成。

这是我写的,代码不起作用,它只返回代码的“else”部分。如果有人可以提供帮助,将不胜感激。我认为问题在于我如何使用 sleep 命令。

#include <stdio.h>
#include <unistd.h>

int main() 
fork();
if (fork() ==0)
    sleep(5);
    printf("This will finish after the parent\n");

else
    printf("This will finish before the child\n");

return 0;

【问题讨论】:

你为什么fork两次? 我的任务是编写一个 C 程序,它允许子代码使用 sleep 命令在父代码之后完成。 哎哟。这不是正确使用sleep()。谁给你这个任务充其量是被误导了。 “正确”的同步只能通过互斥锁、条件变量和信号量等同步对象来完成。 @AndrewHenle 虽然我同意你的说法,但我认为一个使用睡眠的简单示例适合作为关于进程的非常介绍性课程。 您是在终端窗口的 shell 中的命令行上运行程序,还是通过某个 IDE 在自己的窗口中运行程序?如果您在自己的窗口中运行它,则可能发生的是父级退出并且关联的窗口消失,因此您永远看不到子级的输出。在终端窗口中运行程序将显示所需的输出。您也可以在父母的printf 之后添加sleep(6) @DavidSchwartz:程序分叉了 3 次,而不是 2 次。 【参考方案1】:

尝试使用 pid 而不是 fork() 两次

#include <stdio.h>
    #include <unistd.h>
    
    int main() 
    pid_t pid=fork();
    if (pid==0)
        sleep(5);
        printf("This will finish after the parent\n");
    
    else
        printf("This will finish before the child\n");
    
    return 0;
    

【讨论】:

这消除了重复的消息,但并没有解决OP的问题,即看不到孩子的输出。 (另外,pid_t 应该用于保存fork 的返回值,而不是int。) @EricPostpischil 非常感谢。我正在通过 Clion(一个 ide)编译和运行程序。我使用终端运行程序并且它工作。谢谢【参考方案2】:

这是我想出来的,但有点难以区分哪个是子类和父类。

int main() 
    fork();
    if (fork() ==0)
        // sleep(5);
        printf("This will finish after the parent\n");
    
    else
    
    sleep(5);
    printf("This will finish before the child\n");
    
    
    return 0;

【讨论】:

【参考方案3】:

fork系统调用用于创建新进程。父进程和子进程。子进程得到pid==0,而父进程得到pid==(到子进程的主pid)。

#include <stdio.h>
    #include <unistd.h>
    
    int main() 
    pid_t pid=fork();
    if (pid==0)
        sleep(5);
        printf("This will finish after the parent\n");
        printf("child pid is %d\n",getpid());//get the current process pid 
    
    else
    
        printf("This will finish before the child\n");
    printf("child pid is %d\n",pid);
    
    return 0;
     

【讨论】:

以上是关于如何在 C 中正确使用“sleep()”系统调用的主要内容,如果未能解决你的问题,请参考以下文章

计算机系统篇之异常控制流:如何正确地让调用线程休眠一段时间

Linux系统的C语言怎么清屏?

需要在线程任务中正确使用sleep()

在C++里执行VBS 如何执行VBS命令啊 比如Wscript.Sleep 5000 '

在Linux系统系下vi操作中C语言编程,如何进行复制粘贴?求救!

如何系Discuz上载档案10分