我爲它寫了一些C代碼,使用popen得到「ls -la」命令的結果並將結果寫入C中。代碼如下所示:使用popen(「ls -la」)會產生奇怪的結果
unsigned int ls(char *destination, const char *username, const char *relative_path)
{
printf("LS IMP\n");
//if(!username || !relative_path) return -1;
FILE *ls_pipe = NULL;
unsigned long ls_pipe_size = -1;
const char ls_command[] = "ls -la ";
char ls_path[255] = "/home/";
char ls_full_command[255];
char buffer[255];
bzero(buffer, 255);
char *entries = NULL;
bzero(ls_full_command, 255);
strcat(ls_path, username);
strcat(ls_path, relative_path);
strcat(ls_full_command, ls_command);
strcat(ls_full_command, ls_path);
printf("AFTER CATS\n");
ls_pipe = popen(ls_full_command, "r");
if(ls_pipe == NULL) return -1;
printf("Pipe ok!");
fseek(ls_pipe, 0, SEEK_END);
ls_pipe_size = ftell(ls_pipe);
rewind(ls_pipe);
printf("Filesize: %lu\n", ls_pipe_size);
int i;
for(i = 0; i < 100; i++)
{
fread(buffer, 1, 255, ls_pipe);
printf("%s", buffer);
}
//entries = (char*) malloc(sizeof(char) * ls_pipe_size);
//if(entries == NULL) return -1;
printf("Entries ok!\n");
//if(ls_pipe_size != fread(destination, sizeof(char), ls_pipe_size, ls_pipe)) return -1;
fclose(ls_pipe);
return strlen(destination);
}
的問題是管道的大小是巨大的(?),並在適當的結果後,三個項目開始出現不停地換類似於無窮大的結果。
有沒有什麼方法可以在不知道結果行的確切數量的情況下使用類似wc -l的另一個popen?
感謝
P.S有代碼的一些修改當我試圖測試什麼錯和的malloc沒有因爲管道的瘋狂大小的工作。
fread不會添加空,因此%s是錯誤的。 – stark 2013-05-05 21:55:01
是的,我知道,這是更多的調試代碼。問題是我不知道把'\ 0'放在哪裏,因爲在正確的結果之後我得到了垃圾,所以我不知道結果和垃圾開始的位置。 – 2013-05-05 21:57:11
您沒有檢查fseek正在返回的EBADF。 – stark 2013-05-05 21:59:51