免费注册 查看新帖 |

Chinaunix

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

一个关于线程的逻辑问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-21 15:25 |只看该作者 |正序浏览
putchar(char * buf, int count){

char raw[count]  = buf;

kernel_thread(sendto,raw,0);

}

sendto函数的第一条命令就会把raw的内容cp到自己的栈内,这样的话有没有安全隐患?譬如sendto函数对raw的拷贝还没有完成,由于putchar被再次调用,raw的内容又发生了改变?

本人第一次写线程程序,让各位见笑了

[ 本帖最后由 SunGod 于 2008-3-21 15:30 编辑 ]

论坛徽章:
0
80 [报告]
发表于 2009-05-15 17:13 |只看该作者
天空

论坛徽章:
0
79 [报告]
发表于 2009-03-21 19:53 |只看该作者
楼主的意思是 kernel_thread创建线程后,还没来得及在sendto中cp raw的数据,putchar就退出去,造成在栈里的raw归还系统后被挪作了它用。

解决办法有2个
1: 就是flw达达说的,用堆,在堆里申请内存,然后在sendto里释放该内存。
2: 就是同步,在sendto没有cp好raw数据时,不让putchar退出。
以上方法实现的putchar是可重入的,所以不必担心其他函数调用putchar。

论坛徽章:
0
78 [报告]
发表于 2009-03-21 15:53 |只看该作者
原帖由 SunGod 于 2008-3-21 15:25 发表
putchar(char * buf, int count){

char raw[count]  = buf;

kernel_thread(sendto,raw,0);

}

sendto函数的第一条命令就会把raw的内容cp到自己的栈内,这样的话有没有安全隐患?譬如sendto函数对raw ...



太失败了,看了半天没看出咋回事?
感觉是语法问题吧,结果说是c99:“我在几个测试环境下跑了下,没一个编译通过的,看来对c99支持的也太差了”
还是不明白那老兄,那个raw的栈空间,再每次调用putchar的时候都重新分配,怎么会不安全呢???

论坛徽章:
0
77 [报告]
发表于 2009-03-15 14:59 |只看该作者
第二次进入时候的raw[]和上一次的不是一个空间, 有什么安全隐患?

原帖由 SunGod 于 2008-3-21 15:25 发表
putchar(char * buf, int count){

char raw[count]  = buf;

kernel_thread(sendto,raw,0);

}

sendto函数的第一条命令就会把raw的内容cp到自己的栈内,这样的话有没有安全隐患?譬如sendto函数对raw ...

论坛徽章:
0
76 [报告]
发表于 2009-03-15 12:30 |只看该作者

回复 #12 SunGod 的帖子

不是静态数据,是malloc 或kmalloc

论坛徽章:
0
75 [报告]
发表于 2009-03-15 12:22 |只看该作者
原帖由 SunGod 于 2008-3-21 15:32 发表

只要是异步的话,传到堆还不是一样的下场



传堆没冲入性问题,每次进putchar会重新开辟,但是会引入新问题,允许开辟多少,谁来控制。

论坛徽章:
0
74 [报告]
发表于 2008-10-27 14:47 |只看该作者

回复 #71 brtjiba 的帖子

语法其中一个问题放一边不说,lz的意思是他那么干安全不?

论坛徽章:
0
73 [报告]
发表于 2008-03-28 14:35 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
72 [报告]
发表于 2008-03-27 13:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP