免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3744 | 回复: 11
打印 上一主题 下一主题

请教一个关于printk的问题~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-14 06:03 |只看该作者 |倒序浏览
各位大虾:
小弟最近在学习内核编程, 并且动手修改了一个函数--kernel/printk.c中的tty_write_message函数:

/**
* tty_write_message - write a message to a certain tty, not just the console.
*
* This is used for messages that need to be redirected to a specific tty.
* We don't put it into the syslog queue right now maybe in the future if
* really needed.
*/
void tty_write_message(struct tty_struct *tty, char *msg)
{
        /* 添加的部分 */
        int t_length = strlen(msg);
        msg[t_length] = 'H';t_length++;
        msg[t_length] = 'e';t_length++;
        msg[t_length] = 'l';t_length++;
        msg[t_length] = 'l';t_length++;
        msg[t_length] = 'o';t_length++;
        msg[t_length] = '\0';
        /* 添加的部分到此结束, 相当于在原msg后连接上"Hello" */

        if (tty && tty->driver->write)
                tty->driver->write(tty, msg, strlen(msg));
        return;
}

不知道怎样才能让这个改动生效? 比如输出到控制台, 从而让我可以看到效果?
希望大家不吝赐教,谢啦~~

论坛徽章:
0
2 [报告]
发表于 2007-10-14 10:47 |只看该作者
原帖由 daizw 于 2007-10-14 06:03 发表
各位大虾:
小弟最近在学习内核编程, 并且动手修改了一个函数--kernel/printk.c中的tty_write_message函数:

/**
* tty_write_message - write a message to a certain tty, not just the console.
*
* ...

改动生效是什么意思?你应该重新编译内核。
此外,窃以为c还是写简洁点好,例如
  1. msg[t_length] = 'H';t_length++;
复制代码

写成
  1. msg[t_length++] = 'H';
复制代码

要好看一点。
或者你直接用strcpy函数把hello添加上去。

[ 本帖最后由 zx_wing 于 2007-10-14 10:48 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-10-14 12:28 |只看该作者
那个里面strcpy也可以用么?

论坛徽章:
0
4 [报告]
发表于 2007-10-14 12:40 |只看该作者
原帖由 zx_wing 于 2007-10-14 10:47 发表

改动生效是什么意思?你应该重新编译内核。

我已经编译完了, 一切正常. 而且正在使用中,
但是无法看到效果, 控制台的输出并没有多出来"Hello", dmesg和"/var/log/message"中都找不到多出来的"Hello".
这个函数的注释好像是"当重定向到某个tty时"会调用,
但是我不知道这是什么意思, 怎样来实现"重定向到某个tty"?

此外,窃以为c还是写简洁点好,例如
msg[t_length] = 'H';t_length++;
写成
msg[t_length++] = 'H';
要好看一点。
或者你直接用strcpy函数把hello添加上去。

我个人还是习惯可读性强一点,
不过这不是关键问题,呵呵

论坛徽章:
0
5 [报告]
发表于 2007-10-14 13:56 |只看该作者
原帖由 idealities 于 2007-10-14 12:28 发表
那个里面strcpy也可以用么?

可以的,内核的实现版本在lib/string.c中

论坛徽章:
0
6 [报告]
发表于 2007-10-14 13:58 |只看该作者
原帖由 daizw 于 2007-10-14 12:40 发表

我已经编译完了, 一切正常. 而且正在使用中,
但是无法看到效果, 控制台的输出并没有多出来"Hello", dmesg和"/var/log/message"中都找不到多出来的"Hello".
这个函数的注释好像是"当重定向到某个tty时"会调用 ...

噢,是指类似" > /dev/tty0"吗?
你可以试试

  1. echo "say " >/dev/tty0
复制代码

论坛徽章:
0
7 [报告]
发表于 2007-10-14 14:06 |只看该作者
原帖由 zx_wing 于 2007-10-14 13:58 发表

噢,是指类似" > /dev/tty0"吗?
你可以试试

echo "say " >/dev/tty0

似乎么有效果,
比如
echo "say " >/dev/tty2
然后在tty2看到:
[root@localhost root]#say

没有多出来的东西.

论坛徽章:
0
8 [报告]
发表于 2007-10-15 00:14 |只看该作者
原帖由 daizw 于 2007-10-14 14:06 发表

似乎么有效果,
比如
echo "say " >/dev/tty2
然后在tty2看到:

没有多出来的东西.

我也不太清楚,没看过这部分的代码。估计还是调用关系没搞明白,比如这个函数什么时候会调用到。

论坛徽章:
0
9 [报告]
发表于 2007-10-15 10:09 |只看该作者
你的程序都错误了。
往字符串后不属于你的内存加东西

论坛徽章:
0
10 [报告]
发表于 2007-10-15 11:02 |只看该作者
干吗那么费劲,不改成这样呢:

if (tty && tty->driver->write)
{
        tty->driver->write(tty, “hello", 5);
        tty->driver->write(tty, msg, strlen(msg));
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP