プログラムから 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);
}
これにより、私が理解したいことに関する適切な情報が得られることを願っています。
ありがとう!