一、C语言结构体初始化的四种方法
定义:
struct InitMember
{
int first;
double second;
char* third;
float four;
};
方法一:定义时赋值
struct InitMember test = {-10,3.14,"method",0.25};
需要注意的是对应的顺序不能错位。
方法二:定义后逐个赋值
struct InitMember test;
test.first = -10;
test.second = 3.14;
test.third = "method";
test.four = 0.25;
因为是逐个确定的赋值,无所谓顺序。
方法三:定义时乱序赋值(C风格)
这种方法类似于第一种方法和第二种方法的结合体,既能初始化时赋值,也可以不考虑顺序;
struct InitMember test = {
.second = 3.14,
.third = "method",
.first = -10,
.four = 0.25
};
这种方法在Linux内核种经常使用,还是很不错的一种方式。
方法四:定义时乱序赋值(C++风格)
这种方法和前一种类似,网上称之为C++风格,同样不考虑顺序。
struct InitMember test = {
second:3.14,
third:"method",
first:-10,
four:0.25
};
二、Jsoncpp构造空数组
Json::Value jsonArray;
jsonArray.resize(0);
三、Linux杀死同名全部进程的方法
ps -ef | grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9
四、JavaScript向数组中插入元素
var array = [];
array.push(xxx);//尾插
array.unshift(xxx);//头插
五、Linux系统中/dev/mtd与/dev/mtdblock的区别
1、/dev/mtdN是Linux中的MTD架构中,系统自己实现的mtd分区所对应的字符设备(将mtd设备分成多个区,每个区就为一个字符设备),其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。
而mtd-util中的flash_eraseall等工具,就是以这些ioctl为基础而实现的工具,实现一些关于flash的操作。比如,mtd工具中的flash_eraseall中的:
if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
fprintf(stderr, "%s: %s: unable to get MTD device info\n", exe_name, mtd_device);
return 1;
}
其中,MEMGETINFO就是Linux MTD中的drivers/mtd/mtdchar.c中的:
static int mtd_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg)
{
。。。。。
case MEMGETINFO:
info.type = mtd->type;
info.flags = mtd->flags;
info.size = mtd->size;
info.erasesize = mtd->erasesize;
info.writesize = mtd->writesize;
info.oobsize = mtd->oobsize;
/* The below fields are obsolete */
info.ecctype = -1;
info.eccsize = 0;
if (copy_to_user(argp, &info, sizeof(struct mtd_info_user)))
return -EFAULT;
break;
。。。。。
}
2、而/dev/mtdblockN是Nand Flash驱动中,驱动用add_mtd_partitions()添加MTD设备分区(其实就是将mtd设备进行不同的分区,当mtd设备还是一样的,所以mtdblock分区与mtd分区肯定是对应的)而生成的对应的块设备。根据以上内容也就更加明白,为什么不能用nandwrite,flash_eraseall,flash_erase等工具对/dev/mtdblockN进行操作了。因为/dev/mtdblock中不包含对应的ioctl,也就没有定义对应的命令,不支持你这么操作。
3、mtd char设备的主设备号是90,而mtd block设备的主设备号是31:
ls /dev/mtd* -l
crw-r----- 1 root root 90, 0 May 30 2007 /dev/mtd0
crw-r----- 1 root root 90, 2 May 30 2007 /dev/mtd1
crw-r----- 1 root root 90, 4 Jul 17 2009 /dev/mtd2
crw-r----- 1 root root 90, 6 May 30 2007 /dev/mtd3
crwxrwxrwx 1 root root 90, 8 May 30 2007 /dev/mtd4
crwxrwxrwx 1 root root 90, 10 May 30 2007 /dev/mtd5
crwxrwxrwx 1 root root 90, 12 May 30 2007 /dev/mtd6
crwxrwxrwx 1 root root 90, 14 May 30 2007 /dev/mtd7
crwxrwxrwx 1 root root 90, 16 May 30 2007 /dev/mtd8
crwxrwxrwx 1 root root 90, 18 May 30 2007 /dev/mtd9
ls /dev/mtdblock* -l
brw-r----- 1 root root 31, 0 May 30 2007 /dev/mtdblock0
brw-r----- 1 root root 31, 1 May 30 2007 /dev/mtdblock1
brw-r----- 1 root root 31, 2 May 30 2007 /dev/mtdblock2
brw-r----- 1 root root 31, 3 May 30 2007 /dev/mtdblock3
brwxrwxrwx 1 root root 31, 4 May 30 2007 /dev/mtdblock4
brwxrwxrwx 1 root root 31, 5 May 30 2007 /dev/mtdblock5
brwxrwxrwx 1 root root 31, 6 May 30 2007 /dev/mtdblock6
brwxrwxrwx 1 root root 31, 7 May 30 2007 /dev/mtdblock7
brwxrwxrwx 1 root root 31, 8 May 30 2007 /dev/mtdblock8
brwxrwxrwx 1 root root 31, 9 May 30 2007 /dev/mtdblock9
此设备号,定义在/include/linux/mtd/mtd.h中 :
define MTD_CHAR_MAJOR 90
define MTD_BLOCK_MAJOR 31
4、其中,mtd的块设备的大小,可以通过查看分区信息获得:
cat /proc/partitions
major minor #blocks name
31 0 1024 mtdblock0
31 1 8192 mtdblock1
31 2 204800 mtdblock2
31 3 65536 mtdblock3
31 4 225280 mtdblock4
上面显示的块设备大小,是block的数目,每个block是1KB.
而每个字符设备,其实就是对应着上面的每个块设备。即/dev/mtd0对应/dev/mtdblock0,其实以此类推。换句话说,mtdblockN的一些属性,也就是mtdN的属性,比如大小。
5、对每个mtd字符设备的操作,比如利用nandwrite去对/dev/mtd0写数据,实际就是操作/dev/mtdblock0。
而这些操作里面涉及到的偏移量offset,都指的是此mtd分区内的偏移。比如向/dev/mtd1的offset为0的位置写入数据,实际操作的是物理偏移offset=/dev/mtd0的大小=1MB=0x100000。
六、修改boa服务器上传文件的大小限制
/etc/boa/boa.conf
SinglePostLimit 16777216 //16MB
注意要单位是字节。
七、用cgi程序进行交互时,浏览器端出现了如下的错误信息:
502 Bad Gateway
The CGI was not CGI/1.1 compliant
在终端上还会显示这样的提示信息:
cgi_header:unable to find LFIF
这样的错误一般是格式的问题,我写的头是
printf("Content-type: text/html");
正确的应该是:
printf("Content- type: text/html\n\n");
八、从路径中提取文件名
char *tmpStr = NULL;
char name[1024] = "\xxx\a.txt";或者"/xx/a.txt";
t=-1;
while(1){
tmpStr=strstr(name+t+1,"\");
if(NULL==tmpStr)
tmpStr=strstr(name+t+1,"/");//if "\" is not path separator, try "/"
if(NULL!=tmpStr)
t=(int)(tmpStr-name);
else
break;
}
一个开卷有益的公众号:IT平头哥
专注于编程基础知识的分享,助你夯实编程之基。
联系客服