此功能:
char* read_from_pipe()
{
int file = fd[0];
static char buf[100];
FILE *stream;
stream = fdopen(file, "r");
read(file,buf,100);
fclose(stream);
return buf;
}
包含幾個問題。
建議寫它類似於:
#define MAX_BUF_LEN 100
char* read_from_pipe()
{
static char buf[ MAX_BUF_LEN +1 ];
ssize_t byteCount = read(fd[0], buf, MAX_BUF_LEN);
if(0 > byteCount)
{ // an error occurred
perror("read from pipe failed");
buf[0] = '\0';
}
else if(0 == byteCount)
{
fprintf(stderr, "no bytes read\n");
buf[0] = '\0';
}
else
{
buf[byteCount] = '\0';
}
return buf;
} // end function: read_from_pipe
注:read()
不會終止字符數組,所以代碼必須做到這一點,數組必須是1個字符長度超過字符問的最大數量因爲在read()
聲明中。
注意:read()
的語法需要int
,而不是FILE*
作爲其第一個參數。下面是正確的語法:
ssize_t read(int fd, void *buf, size_t count);
此功能:
int fd[2];
void write_to_pipe(char* str)
{
int file = fd[1];
FILE *stream;
//printf("writing to pipe : %s\n", str);
stream = fdopen(file, "w");
//printf("fdopen returned : %d\n",(int)stream);
fprintf(stream, "%s", str);
fclose(stream);
}
極不理想很多。
建議添加類似的東西:
int fd[2]; << in file scope, so visible from functions
void write_to_pipe(char* str)
{
//printf("writing to pipe : %s\n", str);
ssize_t bytesWritten = write(fd[1], str, strlen(str));
if(strlen(str) != bytesWritten)
{
fprintf(stderr, "write to pipe failed to write all bytes\n");
}
else if(0 > bytesWritten)
{
perror("write to pipe failed");
}
} // end function: write_to_pipe
你'read_from_pipe()'有很多比關閉文件描述符更大的問題。你在'FILE *'中調用'read()'。這根本不起作用。 'read()'直接獲取一個文件描述符,並且它不會NUL終止它所讀取的內容。 –
你應該使用[popen(3)](http://man7.org/linux/man-pages/man3/popen.3.html)和'pclose' –
@BasileStarynkevitch但是'popen()'不會提供一個雙向管道。它是隻讀或只寫的。 –