Category: 程序设计

just a joke

 

BOSS:拍照后可以对照片添加特效是我们产品的主要卖点,你们要动脑筋把这个功能做好做强,做出我们品牌的特色,做出让人眼前一亮的产品!

 

UE:啊哈,如果用户拍照后按井号键就可以给照片添加柔焦效果,按星号键就可以自动调整照片对比度,这是多么方便和易用啊。

 

DEV:SetKeyHandler(KEY_POUND, add_soft_focus_effect); SetKeyHandler(KEY_STAR, add_auto_contrast_effect);

 

QA:抱歉,我们的产品是全触屏的,没有物理的井号键和星号键,拍照后也没有弹出软键盘,所以我无法测试这个功能。

 

在内核空间中,是不能直接使用open, read, write之类的系统调用直接访问文件的。那怎么在驱动中访问一个文件呢?

我们知道在内核中用struct file来表示一个打开的文件,file结构体中有一个字段f_op,它是struct file_operation的指针。有了这个指针,就可以对文件进行访问了。
代码如下:

struct file *filp;
mm_segment_t fs;

filp = filp_open("/path/to/your/file", O_RDWR, 0);

if(!IS_ERR(filp))
{
    fs=get_fs();
    set_fs(KERNEL_DS);

    filp->f_op->read(...);
    filp->f_op->write(...);

    set_fs(fs);

    filp->f_op->mmap(...);

    /* ... */
}

filp_close(filp, NULL);


f_op->read()和f_op->write()的第二个参数是char __user *,也就是说是用户空间的地址,所以在驱动中直接传递kernel空间的指针,这两个函数都会返回失败-EFAULT。因此,在f_op->read()和f_op->write()之前需要使用void set_fs(mm_segment_t fs);来改变kernel对内存地址检查的处理方式。
该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,默认情况下,kernel取值为USER_DS。所以可以用set_fs(KERNEL_DS);来让这个两个函数可以接受内核空间的内存。在内核空间中其他用__user修饰的参数,需要用kernel空间的内存代替时,都可以用类似的方法。
另外一个常用的函数f_op->mmap()则不需要设置fs,因为它的参数中不需要用户空间的内存。事实上,在struct file_operation中,只有read和write函数需要用户空间的内存,其他函数都不需要设置fs。
EOF

給一個xxx.xxx.xxx.xxx的字符串,判斷該串是否為合法的IP格式。

不要去耍酷用正則表達式,不要去絞盡腦汁寫一堆帶N多bug的C代碼然後覺得自己的代碼效率還可以。

實際生產中,只用這個方法:

bool  IsValidIP(const char*  ip)
{
    return inet_addr(ip) == -1 ? false : true;
}

我要同时设置label和使用STOCK中的icon,其实很简单,只要调用gtk_image_menu_item_set_image( )函数就可以了。

这个函数的原型是
void gtk_image_menu_item_set_image (GtkImageMenuItem *image_menu_item, GtkWidget *image);

这个函数这样调用比较方便:

menu_item = gtk_image_menu_item_new_with_label (“Label you want to add”);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM(menu_item), gtk_image_new_from_stock (GTK_STOCK_ID, GTK_ICON_SIZE_MENU));

起先没走对路子,折腾死人。

程序员八荣八耻

今天无意见到,风趣幽默又富含经验,虽然是讲Python的,但是所有编程语言都是相通的,好好学习学习。

程序员八荣八耻

以动手实践为荣 , 以只看不练为耻;

以打印日志为荣 , 以单步跟踪为耻;

以空格缩进为荣 , 以制表缩进为耻;

以单元测试为荣 , 以人工测试为耻;

以模块复用为荣 , 以复制粘贴为耻;

以多态应用为荣 , 以分支判断为耻;

以Pythonic为荣 , 以冗余拖沓为耻;

以总结分享为荣 , 以跪求其解为耻;