免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kukucm
打印 上一主题 下一主题

请问errno的问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-11-22 01:01 |只看该作者
menp9999 zalem
请问我27楼对的吗?
我觉得flw斑竹有道理,errno并不是全局变量.但是menp9999说是,我真蒙了
环境变量内核能感知到吗?好象不能吧,如果不能errno又和environ不一样了.实际上内河完全也可以不知道 errno,直接告诉进程:"把错误好放到0xbffff**去了自己去找吧/:,"我越来越觉得是这样的.
一切只能裁了,谁帮我去comp.unix.问问,  我翻译不出来.

论坛徽章:
0
32 [报告]
发表于 2005-11-22 09:15 |只看该作者
原帖由 menp9999 于 2005-11-21 14:21 发表
在同一个系统中,就有可能是宏和 EXTENT INT(条件编译),同多线索没有什么关系,要看errno是不是可以重入的,多线索并不意味着errno就是可以和必须重入的.当然如果没有多线索,也就不应该有什么重入的了.我个人觉得可能 ...

我同意这个观点,看看APUE的原话,“This POSIX.1 definition of errno is stricter than the definition in the C standard. The C standard allows errno to be a macro that expands into a modifiable lvalue of type integer(such as a function that returns a pointer to the error number).”

Linux是符合POSIX标准的,因此它在内核中定义了errno,在内核源代码中可以找到全局定义int errno;而在glibc的源码中我也没找到errno的定义,只有声明或者宏,请注意extern int errno只是声明。

论坛徽章:
0
33 [报告]
发表于 2005-11-22 09:23 |只看该作者
原帖由 flw 于 2005-11-20 13:02 发表

首先,世界上并非只有 Linux,请把目光放长远些,否则会被咒骂为“浅薄”。
其次,即使是 Linux,它也是变化的、发展的。而且,曾经出现过的 Linux 版本,没有一个是把 C 语言的 errno 实现为操作系统的一个变 ...


偶年龄虽比版主大,但是却是个初学者,以前很少到这个版块。但是偶尔会见到投诉flw的贴子,也不以为然。最近是抱着学习和探讨的目的到这个版块的,但的确发现flw的语气有些过份,你水平高不假,但是我不希望你把一些大帽子往别人身上扣。你应该采取一些温和的态度来对待大家。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
34 [报告]
发表于 2005-11-22 09:48 |只看该作者
原帖由 er 于 2005-11-22 09:23 发表


偶年龄虽比版主大,但是却是个初学者,以前很少到这个版块。但是偶尔会见到投诉flw的贴子,也不以为然。最近是抱着学习和探讨的目的到这个版块的,但的确发现flw的语气有些过份,你水平高不假,但是我不希望你 ...

呵呵,我就算是脾气再坏,我说的话却是对的。
想听软话是学不到东西的。
受了批评不知思过,反来寻找我的不是,而且还要搬出“年龄比我大”,这个难道很重要吗?
呵呵。拜托,做学问就要有做学问的态度。连一点争论都受不了,觉得委屈,这能行吗?

论坛徽章:
0
35 [报告]
发表于 2005-11-22 10:04 |只看该作者
原帖由 flw 于 2005-11-22 09:48 发表

呵呵,我就算是脾气再坏,我说的话却是对的。
想听软话是学不到东西的。
受了批评不知思过,反来寻找我的不是,而且还要搬出“年龄比我大”,这个难道很重要吗?
呵呵。拜托,做学问就要有做学问的态度。连一 ...

我搬出年龄大,是表示我有自知之明,知道自己与你的差距。我的意思就是希望你指导大家的态度要好一点,你的话有些伤人,不知你自己有没有感觉到。

论坛徽章:
0
36 [报告]
发表于 2005-11-22 10:50 |只看该作者
是有点硬,但是没有关系啊,我问问题从来也不知道怎么才礼貌些.只要说的是对的就OK了,但是er 和flw 两位的矛盾了啊,你们肯定有一个是错误的,因为linux内核只有一个来源.

我不知道你们两位是怎么来的,  至于我刨根问到底我承认,但是我开始就是想要知道是怎么实现的. 就算你们都是对的,你们也没有一个人说了是怎么实现的,  
还有环境变量, 我昨天翻了一会书,越来发现这个东西内核根本不知道.  

难道大牛们都不屑回答这样的问题?总之不要吵了,我不会再在这个帖子说话了.如果没有我要的答案了,没有意思.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2005-11-22 10:57 |只看该作者
原帖由 er 于 2005-11-22 09:15 发表

Linux是符合POSIX标准的,因此它在内核中定义了errno,在内核源代码中可以找到全局定义int errno;而在glibc的源码中我也没找到errno的定义,只有声明或者宏,请注意extern int errno只是声明。

你说得非常不错,Linux 是符合 XXX 标准,因此,它也有 errno,但是,这个 errno 是否就是大家谈论的 erno 呢?
说得再清楚一点,Linux 内核作为一个程序来讲,它自己有它的 errno,但是,这个 errno 是否就是运行在其上的应用层软件的 errno 呢?
其实这个问题用脚指头想想都可以知道答案,
1:世界上并不是只有 linux,也并不是只有 linux 才遵循 XXX 和 YYY 标准。所以标准应该超越实现。
2:即使是 linux 内核自己,它没有必要、也千万不可以让应用程序都可以随便地读取、修改一个内核自己内部大量使用、并作为流程控制条件的 errno 变量。

这是一个思想问题,不是一个知识点问题。
我承认,如同 flw2 所说,我还没有找到 errno 的实现代码(注),但是,我敢肯定,它不是来自内核。因为我用脚趾头想过了。


注:不过下面的信息从某种程度上能够支持我的观点。
  1. [root@BuildServer ~]# nm /lib/tls/libc-2.3.5.so | grep errno
  2. 00ce6760 T clnt_perrno
  3. 00ce63a0 T clnt_sperrno
  4. 00000008 B errno
  5. 00c142d0 T __errno_location
  6. 00ce63a0 t __GI_clnt_sperrno
  7. 00c142d0 t __GI___errno_location
  8. 00cda550 t __GI___h_errno_location
  9. 0000001c B h_errno
  10. 00cda550 T __h_errno_location
  11. 00000008 b __libc_errno
  12. 0000001c b __libc_h_errno
  13. [root@BuildServer ~]#
复制代码

[ 本帖最后由 flw 于 2005-11-22 11:01 编辑 ]

论坛徽章:
0
38 [报告]
发表于 2005-11-22 11:04 |只看该作者
虽然我也不知道errno从哪来,不过我比较支持flw的看法

论坛徽章:
0
39 [报告]
发表于 2005-11-22 11:16 |只看该作者
在用户程序中可以读取的任何变量都不是内核中的变量。
内核可以读写用户空间的变量,如argv, environ
但反过来永远不成立。否则OS就很快完蛋了。(DOS那样的无保护OS例外)

论坛徽章:
0
40 [报告]
发表于 2005-11-22 11:54 |只看该作者
原帖由 flw 于 2005-11-22 10:57 发表

你说得非常不错,Linux 是符合 XXX 标准,因此,它也有 errno,但是,这个 errno 是否就是大家谈论的 erno 呢?
说得再清楚一点,Linux 内核作为一个程序来讲,它自己有它的 errno,但是,这个 errno 是否就是 ...


这样的解释才专业,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP