2011-02-17 50 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,它返回空^^;