【发布时间】:2016-03-18 21:27:18
【问题描述】:
我正在尝试进行一些初学者内核模块/用户级程序通信。我之前得到了使用fdopen() 的建议,效果很好,但我发现我需要使用open()、read() 和write()。我阅读了这些手册页,并认为我将 fopen、fgets、fputs 正确转换为这些,并且我的程序可以编译,但我没有得到所需的输出。
我有一个计时器,如果我输入./userprogram -s (int) (name),例如./userprogram -s 5 hello,5 秒后它将通过与我的内核模块通信将hello 打印到控制台。在我切换到这些新功能后,它会打印 /lib/ld-uClibc.so.0 (并且现在似乎要等待大约 5 秒)。我是否还需要更改内核级代码的工作方式?我以为我只是能够更改用户级程序,内核模块将继续像以前一样工作。这是我尝试使用注释掉的原始代码:
// open file
int pFile;
pFile = open("/dev/mytimer", O_RDWR);
if (pFile < 0) {
fprintf (stderr, "mytimer module isn't loaded\n");
return 1;
}
// Check if timer set
if (argc >= 4 && strcmp(argv[1], "-s") == 0) {
lenNum = strlen(argv[2]);
lenName = strlen(argv[3]);
char *ptr = malloc(lenNum+lenName+4);
strncat(ptr, argv[1], 2);//flag
strncat(ptr," ", 1);
strncat(ptr, argv[2], lenNum);//timer length
strncat(ptr," ", 1);
strncat(ptr, argv[3], lenName);//message
/* fputs(ptr, pFile); */
write(pFile, ptr, sizeof(ptr));
/*
while (fgets(line, 256, pFile) != NULL) {
printf("%s", line);
} */
while (read(pFile, ptr, sizeof(ptr)) != 0) {
printf("%s", line);
}
欢迎提出任何建议。
【问题讨论】:
-
你已经在使用
open(),至少,如果你是通过fdopen()获取流的话。 -
我想我正在做类似
int file = open()然后FILE *pFile = fdopen(file, "r+");然后在file和fgets()上使用open()和fgets()和fputs()在pFile上。 -
fdopen()将流与打开的文件描述符相关联。您必须以某种方式获取文件描述符,通常是通过open()。你当然可以fdopen()标准文件号之一,但这毫无意义,因为你已经免费获得了stdin、stdout和stderr。 -
您在分配内存以将其复制到时没有考虑
argv[1]的长度。但更糟糕的是strncat(ptr, argv[1], 2);,因为*ptr不是一个初始字符串。malloc不初始化内存它只分配它。 -
您需要检查来自 write() 和 read()(以及所有系统调用)的返回码是否有错误(并报告它们),特别是因为你有问题。顺便说一句,很高兴看到有人使用 K&R 风格进行改变。