read(event->fd, &task, sizeof(task)
类似这样的直接读取一个struct大小,如何保证大小正合适,按理说这是个不严密的写法,但是作者不会视而不见,
这样写应该是有考虑吧,我是百思不得其解,不知道谁能解答一下
感谢
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1 { int a; char b[13]; double c;};
#pragma pack(2)
struct A2 { int a; char b[13]; double c;};
#pragma pack(4)
struct A4 { int a; char b[13]; double c;};
#pragma pack(8)
struct A8 { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
printf("AD.a %d\n",field_offset(AD,a));
printf("AD.b %d\n",field_offset(AD,b));
printf("AD.c %d\n",field_offset(AD,c));
printf("\n");
printf("A1.a %d\n",field_offset(A1,a));
printf("A1.b %d\n",field_offset(A1,b));
printf("A1.c %d\n",field_offset(A1,c));
printf("\n");
printf("A2.a %d\n",field_offset(A2,a));
printf("A2.b %d\n",field_offset(A2,b));
printf("A2.c %d\n",field_offset(A2,c));
printf("\n");
printf("A4.a %d\n",field_offset(A4,a));
printf("A4.b %d\n",field_offset(A4,b));
printf("A4.c %d\n",field_offset(A4,c));
printf("\n");
printf("A8.a %d\n",field_offset(A8,a));
printf("A8.b %d\n",field_offset(A8,b));
printf("A8.c %d\n",field_offset(A8,c));
printf("\n");
printf("A16.a %d\n",field_offset(A16,a));
printf("A16.b %d\n",field_offset(A16,b));
printf("A16.c %d\n",field_offset(A16,c));
printf("\n");
return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
这个取决于你需要读取多少数据啊, 可以是一个结构体,也可以是一个数组。。
但是这个是二进制流,还有信号中断等处理,未必可以一次拿到啊
again:
if ((n = read(fd, buf, BUFFSIZE)) < 0) {
if (errno == EINTR)
goto again;
/* just an interrupted system call */
/* handle other errors */
}
这个取决于你需要读取多少数据啊, 可以是一个结构体,也可以是一个数组。。
但是这个是二进制流,还有信号中断等处理,未必可以一次拿到啊
如果被信号中断,会设置设置errno值为EINTR,你需要每次read后测定erron值以确定后续的操作。
像这样
again:
if ((n = read(fd, buf, BUFFSIZE)) < 0) {
if (errno == EINTR)
goto again;
/* just an interrupted system call */
/* handle other errors */
}
不同的系统有不同的设置,有些系统(比如BSD)把read系统调用被信号中断后自动重启,而不用显式处理EINTR;有些系统需要用户设置此行为属性。
等级:
看这篇文章觉的写的不错,提了开发中遇到问题,如何向大牛问提问的注意事项,受益匪浅。 之前写过一篇《分享我的学习方法——还是坚持+努力...来iteye快一年了,回答了1000多个问题,有会的,也有不会的,在这我总
学校老师让我给写一个论坛,注册发帖回答问题什么的,而且用学校的内部网络,他说很简单让我学学就可以搞定……可是说来简单啊,本人目前就java会一些,可以写贪吃蛇等小游戏吧,真的很菜鸟……请问各路大神有什么...
这是一个合并两含空格字符串的程序: #include #include int main(){ char strA[20],strB[20]; int i,j,n=0; printf("input strA: \n"); gets(strA); printf("input strB: \n"); gets(strB); for(i=0;i(strA)...
输入一个4位数 将每个数字加7后模10然后将第一位数与第三位交换,2与4交换打印加密后的数字
SQL. server 我想统计某个表中每个月的数据。请问语句怎么写呢?
菜鸟求助:求大神帮忙写一个基于NIO的通过服务器转发的客户端对客户端的通信例子,最好有完整的代码注释,不要简单的客户端对服务端的,这个我会写,谢谢
else后面的语句可以是简单语句也可以是一个代码块,如果else后面又跟了一个if else那不应该是一个代码块吗应该加花括号呀。。。不理解书上的解释![图片说明]...
问题详情菜鸟求助:怎么在mysql隔12行取一条数据呀??我的问题是这样的:我的数据库是每5分钟一行数据我要隔一小时取一条数据也就是每隔12行取一行我想的方法是或者是在离小时整数最近的那一条数据取一行,比如在2005-...
官方的DEV C++ 规范好用的自学C语言工具