2011-02-17 77 views
0

我用一个按钮写了一个简单的可可应用程序。阅读命令结果错误(fgets)

当单击该按钮时,计时器被触发:

这里是定时器:

-(void)readCommandResult:(NSTimer *) timer 
{ 
char ps_cmd[256] = {"ls"}; 
BOOL isFgetsOK = NO; 

FILE *fp = popen(ps_cmd, "r"); 
if (fp) { 
    char line[4096]; 
    while (line == fgets(line, 4096, fp)) { 

     isFgetsOK = YES; 
    } 
    pclose(fp); 
} 
else { 

    NSLog(@"popen error"); 
} 
if (!isFgetsOK) { 
    NSLog(@"fgets error"); 
} 
} 

当我运行应用程序时,我会得到“与fgets错误”有时, 它似乎是“行== fgets(行,4096,fp))”失败,但我 不是为什么?

请问有人可以向我解释为什么我在这里得到一个“fgets错误” 有时是随机的?

PS: 我试图改变comamnd(从“ls”到“ps”); 在终端,我得到的结果是:

PID TTY   TIME CMD 
    744 ttys000 0:00.02 -bash 

而在计时器的新代码:

-(void)readCommandResult:(NSTimer *) timer 
    { 
    char ps_cmd[256] = {"ps"}; 
    BOOL isFgetsOK = NO; 

    FILE *fp = popen(ps_cmd, "r"); 
    if (fp) { 
     char line[4096]; 
     while (line == fgets(line, 4096, fp)) { 

         NSLog(@"length:%d line:%s", strlen(line), line); 
      isFgetsOK = YES; 
     } 
     pclose(fp); 
    } 
    else { 

     NSLog(@"popen error"); 
    } 
    if (!isFgetsOK) { 
     NSLog(@"fgets error"); 
    } 
    } 

而且我得到的日志:

19:56:23.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:23.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:24.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:24.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:25.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:25.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:26.780 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:26.781 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:27.782 TopDemo[856:a0f] fgets error 
19:56:28.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:28.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:29.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:29.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:30.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:30.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:31.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:31.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:32.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:32.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:33.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:33.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:34.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:34.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:35.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:35.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:36.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:36.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:37.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:37.783 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:38.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:38.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:39.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:39.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:40.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:40.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:41.782 TopDemo[856:a0f] fgets error 
19:56:42.783 TopDemo[856:a0f] fgets error 
19:56:43.782 TopDemo[856:a0f] fgets error 
19:56:44.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:44.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:45.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:45.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:46.782 TopDemo[856:a0f] fgets error 
19:56:47.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:47.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 
19:56:48.781 TopDemo[856:a0f] length:29 line: PID TTY   TIME CMD 
19:56:48.782 TopDemo[856:a0f] length:31 line: 744 ttys000 0:00.02 -bash 

我想跑应用程序几次和“fgets错误”随机出来 ...

+0

您需要将您的日志调用放在while循环之外。我们知道while循环没有输入问题,否则`isFgetsOK`会被修改。我想知道当fgets没有返回传递给它的指针时你得到了什么输出。为了安全起见,你也应该初始化行“”...... – jswolf19 2011-02-17 13:11:57

+0

另外,`errno`将是一个很好的检查... – jswolf19 2011-02-17 13:14:22

回答

0

的手册页(http://pubs.opengroup.org/onlinepubs/007908799/xsh/fgets.html):

成功完成后,与fgets() 回报秒。如果数据流处于 文件结尾,则设置流的文件结束指示符 ,并且fgets() 返回空指针。如果发生读取 错误,则设置错误指示器 ,则fgets()返回空指针 ,并将errno设置为 指示错误。

在文件末尾,则返回null,如果该文件是小于4096个字符,这将打击EOF在第一次循环,所以 isFgetsOK = YES;将无法​​达成。

对不起,曲解...如果流是 EOF fgets被调用,而不是如果它在呼叫期间到达EOF,它返回空^^;