【问题标题】:Linux System Call write() in c language does not work?c语言中的Linux系统调用write()不起作用?
【发布时间】:2012-10-29 04:39:50
【问题描述】:

我写了以下代码:

它应该接受一个文件名并创建它并写入它。什么都没发生。 我不明白为什么。我尝试搜索并看到类似的示例应该可以正常工作。 如果这很重要,我正在将 VirtualBox 与 Xubuntu 一起使用。

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <time.h>
#include <assert.h>
#include <errno.h> 
#include <string.h>

#define SIZE_4KB        4096
#define FILE_SIZE       16777216



/*Generate a random string*/
char* randomStr(int length)
{
        int i = -1;
        char *result;
        result = (char *)malloc(length);
        while(i++ < length)
        {
                *(result+i) = (random() % 23) + 67;
                if(i%SIZE_4KB)
                        *(result+i) = '\0';
        }
        return result;
}

void writeFile(int fd, char* data, int len, int rate)
{
        int i = 0;
        len--;
        printf("Writing...\n");
        printf("to file %d :", fd);
        while(i < len)
        {
                write(fd, data, rate);
                i += rate;
        }
}

int main(int argc, char** argv)
{
        int i = -1, fd;
        char *rndStr;
        char *filePath;      
        assert (argc == 2);
        filePath = argv[1];
        rndStr = randomStr(FILE_SIZE);
        printf("The file %s was not found\n", filePath);
        fd = open(filePath, O_CREAT, O_WRONLY);
        writeFile(fd, rndStr, FILE_SIZE, SIZE_4KB);
        return 0;
}

【问题讨论】:

  • 您希望发生什么?
  • 我希望你意识到if(i%SIZE_4KB) 表示if(i % SIZE_4KB != 0),即if(i不是SIZE_4KB) 的倍数。 (目前,您将绝大多数 rndStr 设置为空字节。)
  • 学习使用所有警告和调试信息进行编译,即使用gcc -Wall -g,改进您的代码直到没有给出警告,并使用gdb 调试器(也许还有valgrind 内存泄漏检测器) 来调试它。
  • @BasileStarynkevitch - 感谢您的建设性评论。我有时确实使用 dgb 进行调试,在这种情况下它对我没有帮助。但是我没有尝试使用 -Wall 命令(我是新手),这将是我在过去两年中用 c 语言编写的第二个程序。此评论将帮助我改进我的工作。

标签: c linux file system-calls


【解决方案1】:

open 调用错误。通过将参数与 OR 组合来指定多个标志。而且,当您创建文件时,第三个参数应该是您希望文件拥有的权限。所以你的open 电话应该是这样的:

fd = open(filePath, O_CREAT | O_WRONLY, 0666);
if (fd < 0)
    Handle error…

您应该始终测试来自系统调用和库函数的返回值,以查看是否发生错误。

【讨论】:

  • 什么是 0666 ?它看起来不像字符串或数字。感谢您的出色回答。我没有看到我之前尝试的示例中解释的权限。
  • @ArthurWulfWhite:以0 开头的整数文字被解释为八进制(base-8)常量;例如,0666 表示 6×8²+6×8+6。 (八进制不经常使用,除了文件权限,它以八进制友好的方式设计:所有者的读/写/执行权限的三位,组所有者的三位,其他所有人的三位。)
  • 这就是我的想法,所以它需要一个八进制,因为每个用户类型有 3 位,读写和执行?有道理
  • @ArthurWulfWhite:例程不需要八进制,因为传递给它的数字不是八进制或十进制或其他任何值;它只是一个数字(尽管以位表示,所以你可以说它是二进制的)。您可以传递相同的十进制数字 438,它也可以正常工作。只是八进制是人类查看和写入该字段的一种方便方式,因为它巧合地分为三组,每组三位,还有其他一些。
  • @EricPostpischil 是的,我的意思是它期望每种用户类型有 3 位,使八进制成为表示它的自然方式。再次感谢您清理问题并帮助我更好地理解 open() 命令。
猜你喜欢
  • 1970-01-01
  • 2020-01-10
  • 2015-08-22
  • 2011-02-14
  • 2021-07-27
  • 2021-01-13
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多