2017-01-16 113 views
0

我想知道如何,而在这个特殊的代码工作:在这种特殊情况下,如何工作?

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

void main(){ 
    int count=0;  

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

    while(1); 
} 

我只当使用(或做一段时间)与循环内的代码,从来没有使用过它的循环之外,所以我不了解这可能如何工作。感谢您的时间和耐心。

+3

你从哪里看到该代码?这只是一段时间的声明,没有办法打破它的无限状态,所以它保持无限并检查每个周期的真实情况。 – George

+0

你认为它有什么作用? –

+0

我正在学习操作系统,我从一个朋友那里看过一个练习,所以我试着去做,这是看起来是正确的结果。我知道代码的作用,我只是不明白他是如何重复循环之外的代码的。这就像它正在做一个do-while循环 –

回答

3

我知道代码是什么,我只是不明白他是如何重复它在循环之外的代码。这就像它正在做一个do-while循环

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

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

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

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

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

+0

我明白,用fork()我创建一个子进程,这就是为什么它看起来像重复自身(因为它正在执行子)...但如果我拿出fork()代码行它仍然重复自己。 –

+0

我的坏,愚蠢的我编译错误的程序...是的,你是对的,这是因为fork()创建另一个进程。感谢:D –

0

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

+0

我正在学习操作系统,我从一位朋友那里看过一个练习,所以我试着去做这是它看起来是正确的结果。我知道代码的作用,我只是不明白他是如何重复循环之外的代码的。这就像它正在做一个do-while循环 –

+0

对不起,我误解了这个问题。 这是因为你在'while'指令后面加上了分号。在C中,在条件之后放置分号的作用与将'{}'全部替换为无效相同。看看它为什么会这样做的一种方法是考虑在你的'''和'''之间循环“(它显然什么都不做)。 –

-3
while(1); 

基本上是

while (1 == 1) 
{ 
} 

在你不需要的代码里面的while, for, if语句C语法。

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

if (1 == 1) 
; 
else 
; 

if (1 == 1) ; else ; 

在if语句会做什么。您可以对所有其他人执行相同的操作,例如while, for,等。

+0

更多类似,'while(1!= 0)' – Dmitri

+0

我正在学习操作系统,我从一位朋友那里看过一个练习,所以我试着去做,这是看起来是正确的结果。我知道代码的作用,我只是不明白他是如何重复循环之外的代码的。这就像他正在做一个do-while循环 –

+1

所以'while(0)'等于'while(0 == 0)'? – GoodDeeds

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 

叉()通话结束后,程序生成子过程的主处理的并且因此,使得留下的代码(后叉)在平行父和子执行,从而使while循环,循环无限。 如何已经说过老乡用户在(0)好像是在说,而(假的),反之亦然,而(1)或者同时(-1)或其他数这不同于0是同时(真)。

+0

我不知道谁downvote你,但你的答案帮助我要更好地理解fork(),所以感谢:D。我给了你一个upvote,但是对我的声誉没有记录,对不起。 –

+0

我投了票。 hoenir所说的是正确的,因为使用fork()会发生什么。 – ron

相关问题