返回信息流昨天被同事问了个小问题,一时我也懵住了。
问题是这样的
在context_switch函数中添加打印:
printk(prev->threadname -> next->threadname); //伪代码,打印出切换的两个进程。
context_switch是内核函数,作用是进程切换时进行上下文切换。
然后在shell下
#:./li
那么我们期待看到进程切换。原本系统跑的进程是shell,然后li程序开始运行,那么肯定必须从shell切换到li程序,li程序才能开始运行,是不是?但是,为什么没有看到从shell切换到li进程的打印呢?
在庞杂的进程切换中,我们从
#:./li
这一行开始
我们看到 “li -> sh” 的进程切换打印。能看到li程序切出去,却没有li程序切进来。但是却找不到sh -> li 的进程切换。为什么?
这是一条镜像帖。来源:北邮人论坛 / soft-design / #43081同步于 2013/2/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
考个内核问题,为什么context_switch看不到sh->li的进程切换?
zxsword
2013/2/20镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
那句printk。。。算是伪代码么,发帖懒的写全。。。
额,我没表述好,我重新表述一下。
在内核代码的进程上下文切换 context_switch这个函数中加打印。
context_switch函数有prev和next的参数,分别为prev指向被切换的进程,next指向要切换到进程。
然后我们把这两个进程的进程名字打印出来了。
【 在 tonyjansan 的大作中提到: 】
: printk("<0>" ...);
: 不知道行不行...在/proc/kmsg下应该还是会有的吧...
printk("<0>" "%s -> %s", prev->threadname, next->threadname);
// =
printk(KERN_EMERG "%s -> %s", prev->threadname, next->threadname);
【 在 zxsword 的大作中提到: 】
: 那句printk。。。算是伪代码么,发帖懒的写全。。。
: 额,我没表述好,我重新表述一下。
: 在内核代码的进程上下文切换 context_switch这个函数中加打印。
: ...................
不是这个问题哈。
如果是这个原因。那为什么能看到 li -> sh的进程切换呢?
【 在 tonyjansan 的大作中提到: 】
: printk(KERN_EMERG "%s -> %s", prev->threadname, next->threadname);
:
我只是猜而已~会不会是因为输出级别大于或者等于当前的控制台级别所以就丢弃了
【 在 zxsword 的大作中提到: 】
: 不是这个问题哈。
: 如果是这个原因。那为什么能看到 li -> sh的进程切换呢?
当同事问我为什么看不到 切换进 li 程序时,我也很奇怪。
#:./li
同事说,那么这个新进程li必须被切过去才能开始运行。嗯,是这样的没问题。问题是sh fork出来的新进程,这个新进程还是叫sh,只有新的sh exec li之后,新进程的名字才改为了li。。。
所以。。。根本不可能看到切换进li程序。。。倒是能看到 sh->sh 的打印。
咳咳。。。问题就是这样。。。
【 在 tonyjansan 的大作中提到: 】
: 我只是猜而已~会不会是因为输出级别大于或者等于当前的控制台级别所以就丢弃了
: