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));

次に、バッファの内容を、(my_file という名前で) 私が作成した proc エントリに次のように書き込みます。

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() 操作が、バッファーの内容で null 文字に遭遇するとすぐに終了することを確認しました。

なぜこれが起こるのか、構造体の内容を /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 への代入:

struct 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 に答える