【发布时间】:2021-12-30 04:51:59
【问题描述】:
我编写了一个用户空间程序来逐行读取内核设备,不知何故,每次读取都会覆盖数据。你能告诉我如何修复我的代码吗?
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/mman.h>
#define BUFFER_LENGTH 256
int main()
{
int ret,fd;
char buffer[BUFFER_LENGTH];
FILE * fPtr;
unsigned int i=0;
if((fd = open("/dev/show_log_device_dev", O_RDWR)) == -1){
perror("Failed to open the file");
}
//printf("/dev/show_log_device_dev opened.\n");
//fflush(stdout);
fPtr = fopen("log.txt", "w+");
int bytesRead = 0;
while (bytesRead < sizeof(buffer)) {
int ret = read(fd, buffer + bytesRead, sizeof(buffer) - bytesRead);
if (ret == 0)
break;
if (ret == -1) {
perror("Failed to read the message from the device.");
return errno;
/* Handle error */
}
bytesRead += ret;
printf("read from /dev/show_log_device_dev. %s\n",buffer);
}
if(lseek(fPtr,0,SEEK_SET)!=0) {
fprintf(fPtr,"%s",buffer);
}
fclose(fPtr);
}
我希望输出文件“log.txt”包含写入缓冲区的所有行,每个读取行在行之间跳过行。请告诉我正确的方法,而不是我上面写的 fprintf 尝试。
谢谢。
【问题讨论】:
-
为什么是
lseek()?你有没有确保buffer是一个正确的以 0 结尾的字符串? -
我没有验证缓冲区是否为 0 终止...此外,我使用 lseek 查找文件的末尾并写入它,至少这就是我虽然写作的原因。我需要逐行写入该文件的正确方法,即将
buffer写入下一行第一个可用位置的文件中。我不知道该怎么做。 -
试试这里的解决方案 stackoverflow.com/questions/2029103/…>.
-
您正在寻找文件的开头...(还有
lseek()用于文件描述符,而不是FILE指针。如何编译?) -
用户空间代码看起来很合理。除了
lseek打电话给FILE*。 “情况太不同了,我不是试图从文件中读取,而是从设备中读取。” - 从设备读取不应与从文本文件读取不同......除非您的设备非常特殊。在最后一种情况下,您需要提供您设备的代码,否则我们无法为您提供帮助。