Linux 版 (精华区)

发信人: netiscpu (说不如做), 信区: Unix
标  题: Gcc的安装与使用 (11)
发信站: 紫 丁 香 (Sat May 16 21:02:13 1998), 转信



发信人: jacky (绞肉机), 信区: linux
标  题: Gcc的安装与使用11
发信站: 饮水思源站 (Fri May 15 16:42:30 1998) , 站内信件




原始的程式片段,使用read().

     int result;
     while (len > 0) { 
       result = read(fd,buffer,len);
       if (result < 0) break;
       buffer += result; len -= result;
     }

修改成, 

     int result;
     while (len > 0) { 
       result = read(fd,buffer,len);
       if (result < 0) { if (errno != EINTR) break; }
       else { buffer += result; len -= result; }
     }

原始的程式片段,使用ioctl().

     int result;
     result = ioctl(fd,cmd,addr);

修改成, 

     int result;
     do { result = ioctl(fd,cmd,addr); }
     while ((result == -1) && (errno == EINTR));

注意一点,有些版本的BSD Unix,其内定的行为(default behaviour)是重新执行系统呼叫.若
要让系统呼叫中断,得使用 SV_INTERRUPT或SA_INTERRUPT旗号.

4.3.9. 可以写入的字串(Writable strings) 

gcc对其users总怀抱著乐观的想法(optimistic view),相信当他们打算让某个字串当作常数
来用时---那它就真的只是字串常数而已.因此,这种字串常数会储存在程式码的记忆体
区段内(in the code area of the program).这块区域可以page到磁碟机的image上,避免耗掉
swap的记忆体空间,而且任何尝试写入的举动都会造成分页的错误(segmentation fault).这
可是一种特色呢!

对老旧一点的程式而言, 这可能会产生一个问题.例如,呼叫mktemp(),传递引数
(arguments)是字串常数. mktemp()会尝试著在*适当的位置(in place)*重新写入它的引数.

修正的方法不外乎(a)以-fwritable-strings编译,迫使gcc将此常数置放在资料记忆体
空间(data space)内.或者(b)将侵犯地权的部份(offending parts)重新改写,配置一个不为常数
的字串(non-constant string),在呼叫前,先以strcpy()将资料拷贝进去.

4.3.10. 为什麽呼叫execl()会失败? 

那是因为你呼叫的方式不对.execl的第一个引数是你想要执行的程式名.第二个与接续
的引数会变成你所呼叫的程式的argv阵列(array).记住:传统上,argv[0]是只有当程式没
有带著引数执行时,才会有设定值.所以罗,你应该这样写:

     execl("/bin/ls","ls",NULL);

而不是只有, 

     execl("/bin/ls", NULL);

执行程式而不带任何引数(with no arguments),可解释成(construe)是一种邀请函(invitation),
目的是把此程式的动态程式库独立(dynamic library dependencies)的特性印出来(print out).
至少,a.out是这样的.就ELF而言,事情就不是这样了.

--
m;33m※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.112.26.100]m


--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.199毫秒