我正在学习用于编写linux设备驱动程序的阻塞I/O函数,我想知道它的用法是什么ERESTARTSYS.考虑以下:
全局变量:
wait_queue_head_t my_wait_q_head;
int read_avail = 0;
Run Code Online (Sandbox Code Playgroud)
device_init():
init_waitqueue_head(&my_wait_q_head);
device_read():
printk("I'm inside driver read!\n");
wait_event_interruptible(&my_wait_q_head, read_avail != 0);
printk("I'm awaken!\n");
Run Code Online (Sandbox Code Playgroud)
device_write():
read_avail = 1;
wake_up_interruptible(&my_wait_q_head);
Run Code Online (Sandbox Code Playgroud)
当我调用read()from用户空间时,命令提示符会挂起,直到我write()按预期调用.的printk消息相应地出现,以及在dmesg.但是,我看到一些像这样编写的驱动程序:
另一个版本的device_read():
printk("I'm inside driver read!\n");
if(wait_event_interruptible(&my_wait_q_head, read_avail != 0))
{return -ERESTARTSYS;}
printk("I'm awaken!\n");
Run Code Online (Sandbox Code Playgroud)
我测试了device_read()在用户空间中使用相同方法的第二个版本,结果完全相同,那么,ERESTARTSYS的用途是什么?
p/s:我已经阅读了这本书上的Linux设备驱动程序,但是我没有得到它,有人可以举例来说明吗?:
一旦我们通过那个电话,有些东西唤醒了我们,但我们不知道是什么.一种可能性是该过程接收到信号.包含wait_event_interruptible调用的if语句将检查此情况.这个陈述确保了对信号的适当和预期的反应,这可能是唤醒过程的原因(因为我们处于可中断的睡眠状态).如果信号已到达并且尚未被进程阻止,则正确的行为是让内核的上层处理事件.为此,驱动程序将-ERESTARTSYS返回给调用者; 此值由虚拟文件系统(VFS)层在内部使用,该层可重新启动系统调用或将-EINTR返回到用户空间.我们使用相同类型的检查来处理每个读写实现的信号处理.
我正在尝试使用TextField()Jetpack Compose。我希望文本颜色为白色。
我发现这有效:
ProvideTextStyle(TextStyle(color = Color.White)) {
TextField(
...
)
}
Run Code Online (Sandbox Code Playgroud)
但是,我想在主题级别覆盖它,这样我就不需要重复编写ProvideTextStyle. 我看到MaterialTheme只接受以下参数:
@Composable
fun MaterialTheme(
colors: Colors = MaterialTheme.colors,
typography: Typography = MaterialTheme.typography,
shapes: Shapes = MaterialTheme.shapes,
content: @Composable () -> Unit
)
Run Code Online (Sandbox Code Playgroud)
所以我不知道该怎么做。有人可以帮忙吗?
(撰写版本 = 1.0.0-alpha11)
android android-layout android-jetpack-compose android-compose-textfield android-jetpack-compose-text
我正在研究编写嵌入式Linux驱动程序,并决定开发一些GPIO以确保我正确理解本书(LDD3,第9.4.1节).
我可以按照预期控制正确的GPIO引脚(使其高低,我用万用表探测); 但是,我测试了2个代码,一个有request_mem_region(),一个没有.我期待一个没有失败的人,但两个都工作得很好.
代码request_mem_region:
if( request_mem_region( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF,DEVICE_NAME ) == NULL )
{
printk( KERN_ALERT
"GPIO_140_141_conf_phys error:%s: unable to obtain I/O memory address 0x%08llX\n",
DEVICE_NAME, PIN3_CONF_PHYS );
return -EBUSY;
}
pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
//-----------------------------------------------------------------
if( request_mem_region( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5,DEVICE_NAME ) == NULL )
{
printk( KERN_ALERT
"error:%s: unable to obtain I/O memory address 0x%08llX\n",
DEVICE_NAME, GPIO_BANK5_PHYS );
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试使指针颜色EditText变为蓝色.
我能够使下划线和光标变为蓝色,但是液滴外观指针仍然是灰色的.
我有点谷歌,但所有出现的链接只谈论如何更改光标,而不是指针.所以,如果有人知道如何做到这一点,我需要你的帮助.
我只需要支持Android 5.0及更高版本.因此,如果您的解决方案仅适用于API> 21,那就完全没问题了.
谢谢!
android textview android-widget android-layout android-edittext
我正在学习Linux设备驱动程序的第3.5章,第3版.本节介绍一种检索我们struct inode *inode在open函数中定义的自定义结构的方法:
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev;
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当设备打开时,struct inode *inode表示设备的传递scull_open.然后,dev提取并传递自定义结构,filp->private_data以便其他方法scull_read可以使用它:
ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
loff_t *f_pos)
{
struct scull_dev *dev = filp->private_data;
/* other codes that uses *dev */
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很好,直到我意识到我们已经struct scull_dev …
我正在学习如何使用list.h中的内核链表API .
我了解到我需要list_for_each_safe()在删除节点时使用list_del()而不是使用list_for_each().
代码list_for_each_safe():
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
Run Code Online (Sandbox Code Playgroud)
代码list_for_each():
for (pos = (head)->next; pos != (head); pos = pos->next)
Run Code Online (Sandbox Code Playgroud)
我注意到它们都非常相似,只是_safe版本需要额外的参数用作"临时存储"(在此声明为list.h).
我知道什么时候应用函数correcly,_safe版本删除,正常版本访问,但我很好奇额外的论点如何使它"安全"?
请考虑以下内容,我将删除链接列表中的每个节点list_for_each_safe():
struct kool_list{
int to;
struct list_head list;
int from;
};
struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist; …Run Code Online (Sandbox Code Playgroud) 我正在学习使用内核模块的注册register_chrdev_region(dev_t from, unsigned count, const char * name);.
我注意到有或没有这个函数,我的内核模块按预期工作.我用来测试的代码:
first = MKDEV(MAJOR_NUM, MINOR_NUM);
register_chrdev_region(first, count, DEVICE_NAME);//<---with and without
mycdev=cdev_alloc();
mycdev->ops= &fops;
mycdev->owner = THIS_MODULE;
if (cdev_add(mycdev,first, count) == 0)
{printk(KERN_ALERT "driver loaded\n");}
Run Code Online (Sandbox Code Playgroud)
我评论了这一行register_chrdev_region(first, count, DEVICE_NAME);,printk消息仍然出现.我试图在有或没有用户空间的情况下与驱动程序通信,并且两者都是成功的.
所以我的问题是,这个函数register_chrdev_region()是用来让我的驱动程序成为一个好的内核公民,就像告诉其他人"我用完主要数字,请不要使用"?
我试着看一下内核源代码char_dev.c来理解这个函数,但是我发现它太难理解了,有人熟悉这个吗?
谢谢!
我正在学习git并正在使用gitk可视化我的历史和分支.
我尝试gitk了一个本地初始化的repo,它能够显示我正确制作的两个分支.
但是,当我尝试启动gitk以使用获得的repo进行可视化时git clone,gitk仅显示其中一个分支.
这是发生的事情:
在我做了之后git clone,我可以在本地看到1个分支:
$ git branch
* experiment
Run Code Online (Sandbox Code Playgroud)
所以我git checkout -b master origin/master现在创建了我的本地跟踪分支:
$ git branch
experiment
* master
Run Code Online (Sandbox Code Playgroud)
现在我以为我有2个本地分支,所以我很乐意启动gitk,但是,我只能看到一个分支:

我知道通过以下方式查看隐藏master分支的方法gitk --all:

但现在我真的好奇为什么gitk不展示master我在这里的当地分公司,有没有人有任何想法?
谢谢!
C:\Sites\dtr-payroll>rake assets:precompile
rake aborted!
You have already activated rake 10.0.4, but your Gemfile requires rake 10.0.3. Using bundle exec may solve this.
C:/Sites/dtr-payroll/config/boot.rb:6:in `<top (required)>'
C:/Sites/dtr-payroll/config/application.rb:1:in `<top (required)>'
C:/Sites/dtr-payroll/Rakefile:5:in `<top (required)>'
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Android中实施Google Analytic广告系列跟踪.我按照本指南操作:https://developers.google.com/analytics/devguides/collection/android/v2/campaigns
这就是我所做的:
将此添加到AndroidManifest:
<!-- Used for install referral measurement-->
<service android:name="com.google.analytics.tracking.android.CampaignTrackingService"/>
<receiver android:name="com.google.analytics.tracking.android.CampaignTrackingReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
按照本指南(https://developers.google.com/analytics/solutions/testing-play-campaigns)执行广播:
adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n com.my.app/com.google.analytics.tracking.android.CampaignTrackingReceiver --es "referrer" "utm_source%3Dtest_source%26utm_medium%3Dtest_medium%26utm_term%3Dtest_term%26utm_content%3Dtest_content%26utm_campaign%3Dtest_name"
Run Code Online (Sandbox Code Playgroud)
我检查了logcat,它正确地显示了这一行:
02-12 11:47:13.190: I/GAV3(18963): Thread[GAThread,5,main]: Campaign found: utm_source%3Dtest_source%26utm_medium%3Dtest_medium%26utm_term%3Dtest_term%26utm_content%3Dtest_content%26utm_campaign%3Dtest_name
Run Code Online (Sandbox Code Playgroud)
但是,它还有另外两条线:
02-12 11:47:18.280: W/System.err(18963): [DEBUG] GbaRequest - GbaRequest: Constructor Called 222 userAgent Apache-HttpClient/UNAVAILABLE (java 1.4)
02-12 11:47:18.280: W/System.err(18963): [DEBUG] NafRequest - NafRequest: NafRequest constructor===useragent Apache-HttpClient/UNAVAILABLE (java 1.4)
Run Code Online (Sandbox Code Playgroud)
我检查了GA报告页面取得下- >谷歌播放- >源,它的只显示(未设置),(无)或(直接),但不是source,medium等我期待看到: …
c ×5
linux-kernel ×5
android ×3
android-jetpack-compose-text ×1
foreach ×1
git ×1
gitk ×1
inode ×1
kernel ×1
linked-list ×1
linux ×1
mysql ×1
phpmyadmin ×1
postgresql ×1
textview ×1
windows ×1