我有一个函数,将文件名作为输入并执行“打开”和“读取”调用以执行某些操作。该文件名是通过命令行参数接收的。 现在,我试图使此函数通用,以便它也可以接收字符串并执行相同的操作。换句话说,我将文件的内容直接作为字符串传递。
我不知道如何将字符串数据流式传输到“打开”功能。 另外,请注意,我只能使用打开功能来读取文件。
我尝试使用“管道”功能将数据流式传输为打开功能,但未成功。
int sopen(char *s) {
int p[2], ret;
int fd=-1;
int len = strlen(s);
if (pipe(p) != 0) {
fprintf(stderr, "Error in creating pipe");
return -1;
}
if ((fd = open(p[0], O_RDONLY)) < 0) {
fprintf(stderr, "Error in open");
close(p[0]);
close(p[1]);
return -1;
}
ret = write(p[1], s, len);
if (ret != len) {
fprintf(stderr, "Error in writing to pipe");
close(p[1]);
close(fd);
return -1;
}
close(p[1]);
return fd;
}
我希望有一个文件描述符,以便打开功能可以使用它,但是它返回-1。
答案 0 :(得分:1)
正如其他人所说,pipe()
函数返回两个已经可以使用的描述符。这意味着pipe()
已经为您打开了它们。否则,不能保证它们相互连接。
请记住,您有责任关闭它们!
您的整个解决方案都应类似于下面的伪代码:
main
variable: fileDescriptor
detect if command line contains a filename, or file content
if it was a filename
fileDecriptor = openFile(some arguments...)
if it was a filecontent
fileDecriptor = openAndFillPipe(some other arguments...)
doWhetever(fileDescriptor) // here's the 'operations' on the 'file'
close(fileDescriptor) // whatever we got, we need to clean it up
openFile(filename)
// simply: any file-opening will do
descriptor = open(filename, ...)
openAndFillPipe(filecontent)
// first, make a pipe: two connected descriptors
int pairOfDescriptors[2];
pipe(pairOfDescriptors);
// [0] is for reading, [1] is for writing
write(pairOfDescriptors[1], filecontent, ...) // write as if to a file
close(pairOfDescriptors[1]) // we DONT need the 'write' side anymore
descriptor = pairOfDescriptors[0] // return the 'read' as if it was a file