c - 我对 read() 和 write() 做错了什么?

标签 c linux file-io unistd.h

我正在尝试做一些初学者内核模块/用户级程序通信。我之前得到建议使用 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);
    }   

如有任何建议,我们将不胜感激。

最佳答案

[I] thought I converted the fopen,fgets,fputs to these correctly

...但是你错了。没有基于单行 write() 的等价于 fputs(),也没有基于单行 read() 的等价于fgets()。当您使用低级 read()write() 时,基于流的 I/O 函数会做很多您必须自己做的工作。

一些区别是:

  • read() 不提供字符串终止。你必须自己做。
  • write() 不注意字符串终止。如果您希望它在字符串终止符处停止,那么您必须通过您要求它传输的字节数来控制它。
  • read()write() 都不能保证在一次调用中传输请求的全部字节数。如果您想传输特定数量的字节,那么您必须准备好循环。
  • read() 不会在任何特定字符处自动停止,包括换行符
  • 大多数流都提供缓冲,对您来说是不可见的。如果您想缓冲您的 read()write(),那么您必须自己处理(但这些函数非常适合它)。

但是,在您的特定情况下,您还犯了语义错误。 write()read() 的第三个参数是要传输的最大字节数——通常是缓冲区的大小——但是 sizeof (ptr) 是指针本身的大小,而不是它指向的空间的大小。

关于c - 我对 read() 和 write() 做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36094531/

相关文章:

c - OpenCL:内核之间的同步

c - while(1) 无限循环执行它的第一条语句并且不转到下一条语句

linux - 如何使用带有模式的 bash 删除文件中的行 block 并将剩余的行保存在另一个文件中

linux - X 服务器使用什么像素格式?

python - 操作写入文件类

c - 这种切换字符串的方式有效吗?有没有效率更高的?

linux - 递归复制特定文件

java - 从内存使用和性能的角度来看,ByteArrayOutputStream 与 FileOutputStream

r - 如何使用 UTF-8 编码保存的 source() .R 文件?

c - 将数字输入到avr中的寄存器中