我正在运行的Linux,我试图做到以下几点:
一切工作正常(缓冲区正确填写ls的结果),但是当我检查pclose()结果它返回-1和errno设置为10(没有subprocess)。 不知道为什么发生这种情况,但我不能忽视它(除非有合理的解释,为什么发生这种情况)。
我的代码:
FILE * lsoutput = NULL; lsoutput = popen("ls -ltr", "r"); if (readFromPipeOrFile(lsOutput, pSendBuf, pSendActualSize) == -1) { printf("readFromPipeOrFile failed."); pclose(lsOutput); safeFree(pSendBuf); return -1; } if (pclose(lsOutput) == -1) // No idea why it returns -1 but it does... { printf("pclose failed"); printf("errno: %d\n", errno); printf("strerror: '%s'", strerror(errno)); return -1; }
readFromPipeOrFile(函数写入缓冲区)的代码:
int readFromPipeOrFile(FILE * pipeOrFile, char ** pSendBuf, size_t * pSendActualSize) { int multiplication = 1; char * pSendBufCurrentLocation = NULL; ERR_RETURN(pipeOrFile == NULL || pSendBuf == NULL || pSendActualSize == NULL, "No values should be NULL."); ERR_RETURN(*pSendBuf != NULL, "*pSendBuf should be NULL"); *pSendBuf = (char *) calloc (MAX_READ_FROM_STREAM * multiplication, sizeof(char)); ERR_RETURN(*pSendBuf == NULL, "Failed allocating sendBuf"); pSendBufCurrentLocation = *pSendBuf; while (fread(pSendBufCurrentLocation, MAX_READ_FROM_STREAM, 1, pipeOrFile) == 1) { ++multiplication; *pSendBuf = realloc(*pSendBuf, MAX_READ_FROM_STREAM * multiplication); ERR_RETURN(*pSendBuf == NULL, "Failed re-allocating sendBuf"); pSendBufCurrentLocation = *pSendBuf + (MAX_READ_FROM_STREAM * (multiplication - 1)); memset(pSendBufCurrentLocation, '\0', MAX_READ_FROM_STREAM); } ERR_RETURN(!feof(pipeOrFile), "Hasn't reached eof but fread stopped"); ERR_RETURN(ferror(pipeOrFile), "Error in fread"); *pSendActualSize = MAX_READ_FROM_STREAM * multiplication; return 0; }
提前致谢! 编辑:ERR_RETURN只是一个macros,检查第一个参数的条件是否为真,如果是,在第二个参数中打印string,并返回-1。
根据pclose()
的文档,如果wait4
返回错误,则返回-1
。 然而,它没有说设置errno
(除了设置ECHILD
如果它无法获得一个孩子的地位),所以我不确定你可以指望strerror()
字符串是准确的。
这意味着, ls
退出时会显示错误代码,这意味着ls
无法访问子目录(权限错误?)。 所以,你有结果,因为ls
返回它可以读取的内容,但是它是不完整的读取,因为它不能访问递归中的子目录。
signal(SIGCHLD,SIG_IGN)将导致pclose()结果返回-1,errno被设置为10(没有子进程)。