0

我想将一个字符缓冲区从我的程序传递给一个 proc 条目(比如 /proc/my_file)。此字符缓冲区包含我的结构的元素,其形式为:

struct my_table { char src_ip[4]; char dest_ip[4]; int out_flag; }my_t;

我分配 my_table 的元素并将其内容复制到 unsigned char 缓冲区,如下所示:

memcpy(buffer, &my_t, sizeof(struct my_table));

然后我将缓冲区的内容写入我创建的 proc 条目(名称为 my_file),如下所示:

write(fd, buffer, sizeof(buffer));

其中 fd 是使用 O_WRONLY 打开 /proc/my_file 后 open() 返回的文件描述符 | O_APPEND 标志。

我无法理解的是,在这种情况下,我只能看到第一个字符串,即 my_t.src_ip 被写入 /proc/my_file (做了

猫 /proc/my_file

检查写入的内容),随后我观察到 /proc/my_file 的 write() 操作在缓冲区内容中遇到空字符时立即结束。

我可以知道为什么会发生这种情况以及如何解决将结构的内容写入 /proc 条目的问题吗?

编辑:SSCCE 我的问题:结构:

struct my_iptable { 
    char protocol[5];                   // to check whether the protocol mentioned is tcp/udp/icmp 
    char src_ip[16];                    // source ip address
    char dest_ip[16];                   // destination ip address
    char src_net_mask[16];              // source net mask
    char dest_net_mask[16];             // destination net mask
    int src_port;                       // source port number
    int dest_port;                      // destination port number
    char action[8];                     // either block or unblock
    int delete_rule;                    // gets the rule number to be deleted
    int print_flag;                     // is set if we are asked to print the rules that have been set         
    int out_flag;                       // is set if the packet is outbound, else set to 0;
};

将 my_ipt 赋值为 null:

结构 my_iptable my_ipt; memset(&my_ipt, '\0', sizeof(struct my_iptable));

我已经正确分配了 my_ipt 的字段。

复制到缓冲区和写入 proc 部分:

unsigned char write_buf[sizeof(struct my_iptable)];     
    memcpy(write_buf, &my_ipt, sizeof(struct my_iptable));
int proc_fp = open("/proc/minifw", O_WRONLY | O_APPEND);
    if(proc_fp < 0) {
        printf("Couldn't open /proc/minifw for writing\n");
        exit(EXIT_FAILURE);}

   if(write(proc_fp, write_buf, sizeof(struct my_iptable)) == -1) {
        printf("There was an error writing to minifw buffer\n");
        exit(EXIT_FAILURE);
    }

我希望这可以为您提供有关我想了解的内容的适当信息。

谢谢!

4

1 回答 1

3

sizeof(struct my_table)改为使用

write(fd, buffer, sizeof(struct my_table));

如果你buffer被定义为指针:

struct my_table *buffer;

那么 的大小buffer将等于指针的大小(32 位系统为 4,64 位系统为 8),而不是实际大小struct my_table

于 2013-03-28T13:17:24.580 回答