在这种特殊情况下如何工作?

时间:2017-01-16 17:24:00

标签: c while-loop

我想知道在这个特定代码中工作的时间:

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

void main(){
    int count=0;    

    fork();
    printf("PID: %d\nCounter: %d\n",getpid(),++count);
    sleep(1);

    while(1);
}

我只在循环中使用代码时(或执行时间),从不在循环外使用它,所以我不明白这是如何工作的。感谢您的时间和耐心。

4 个答案:

答案 0 :(得分:3)

  

我知道代码的作用我只是不知道他是如何重复它在循环之外的代码。这就像是在做一个do-while循环

循环外的内容被“重复”与while()语句无关。

当程序开始运行时,它会遇到fork();语句。这将创建一个新进程,其中包含当前进程的地址空间副本。然后,两个都继续执行。每个进程都执行自己的printf()语句并显示其各自的进程ID。

每个进程最终都会遇到while(1);语句。在C中,任何非零整数在评估条件时都等于true。因此,从逻辑上讲,while(1);相当于while(true);。分号表示循环体是空的。

因此,当任一进程到达while(1);语句时,它会陷入无限循环。

执行两次的printf()语句是由于存在两个进程,并且与while(1);语句无关。

答案 1 :(得分:0)

C的默认条件可以在“is(condition)不同于0?”时读取。 在你的情况下,那是“While(1)与0不同”,因此导致无限循环。 程序将无限期地循环这个精确的指令(While)。

答案 2 :(得分:0)

在linux上,用这样的gcc编译这个程序后

gcc -o main main.c

像这样运行程序

./main

如果您尝试使用“主”名称打印出流程,我们就会这样做。

$ ps aux | grep main
hoenir    3084 74.3  0.0   4160   676 pts/2    R+   19:34   0:04 ./main
hoenir    3085 74.3  0.0   4160    72 pts/2    R+   19:34   0:04 ./main

fork()之后,调用程序生成主进程的子进程,从而使代码保留(在fork之后)在父进程和子进程中执行并行,从而使while循环无限循环。 同伴用户已经说过(0)就像说(假)和反向(1)或while(-1)或其他数字不同于0 同时(真)。 / p>

答案 3 :(得分:-3)

while(1);

基本上是

while ( 1 == 1)
{
}

在C语法中,您不需要while, for, if语句中的代码。

下面这段代码在语法上是有效的

if ( 1 == 1)
;
else
;

if ( 1 == 1 ) ; else ;

if语句不执行任何操作。您可以对所有其他人执行相同操作 - while, for,等等。