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毫秒