我用一个按钮写了一个简单的可可应用程序。阅读命令结果错误(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错误”随机出来 ...
您需要将您的日志调用放在while循环之外。我们知道while循环没有输入问题,否则`isFgetsOK`会被修改。我想知道当fgets没有返回传递给它的指针时你得到了什么输出。为了安全起见,你也应该初始化行“”...... – jswolf19 2011-02-17 13:11:57
另外,`errno`将是一个很好的检查... – jswolf19 2011-02-17 13:14:22