当前位置: 技术问答>linux和unix
诡异的问题,关于应用程序调用驱动内函数时的执行顺序
来源: 互联网 发布时间:2016-07-08
本文导语: 应用程序代码: case (1): printf ("A"); printf ("B"); printf ("C"); ioctl (fd, DATA_WRITE, NULL); printf ("D"); continue; 对应的驱动程序代码:(ioctl中) case DATA_WRITE: printk ("E"); break; 理论上结果应该是ABDC,但是我...
应用程序代码:
case (1):
printf ("A");
printf ("B");
printf ("C");
ioctl (fd, DATA_WRITE, NULL);
printf ("D");
continue;
对应的驱动程序代码:(ioctl中)
case DATA_WRITE:
printk ("E");
break;
理论上结果应该是ABDC,但是我实际的输出顺序是ABCED
做了很多实验,发现貌似与换行符有关:
1.其他不变,把“A”换成“An”,输出:
A
EBCD
2.其他不变,把“B”换成“Bn”,输出:
AB
ECD
3.其他不变,把“B”换成“nB”,输出:
A
EBCD
可见,在哪里加上n,n前面的就会在ioctl之前输出,甚至会出现3.那样输出n后马上跳到ioctl再跳回来输出剩下半句的诡异情况。
虽然我知道新手问问题的时候要有自己的判断,但是我想破脑袋也找不到任何合理的解释
求高手解答下!、
case (1):
printf ("A");
printf ("B");
printf ("C");
ioctl (fd, DATA_WRITE, NULL);
printf ("D");
continue;
对应的驱动程序代码:(ioctl中)
case DATA_WRITE:
printk ("E");
break;
理论上结果应该是ABDC,但是我实际的输出顺序是ABCED
做了很多实验,发现貌似与换行符有关:
1.其他不变,把“A”换成“An”,输出:
A
EBCD
2.其他不变,把“B”换成“Bn”,输出:
AB
ECD
3.其他不变,把“B”换成“nB”,输出:
A
EBCD
可见,在哪里加上n,n前面的就会在ioctl之前输出,甚至会出现3.那样输出n后马上跳到ioctl再跳回来输出剩下半句的诡异情况。
虽然我知道新手问问题的时候要有自己的判断,但是我想破脑袋也找不到任何合理的解释
求高手解答下!、
|
这没什么奇怪的吧, printf 是有缓冲区的, 并不是直接输出到屏幕上,
当遇到 n 或者 调用 fflush 的时候才会刷新的屏幕上。
而 kernel 态的 printk 和用户态的 printf 不同,它是直接把数据送到 tty 设备。优先级会比较高。
当遇到 n 或者 调用 fflush 的时候才会刷新的屏幕上。
而 kernel 态的 printk 和用户态的 printf 不同,它是直接把数据送到 tty 设备。优先级会比较高。