LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 922|回复: 6

帮看一下返回当前系统有关信息的程序 错在哪?

[复制链接]
发表于 2007-3-5 20:19:15 | 显示全部楼层 |阅读模式
  1. #include        "apue.h"
  2. #include        <sys/utsname.h>

  3. int        main(void)
  4. {
  5.         struct utsname        *pa;

  6.         if (uname(pa) < 0)
  7.                 err_sys("uname error");

  8.         printf("%s\n",pa->sysname);
  9.         printf("%s\n",pa->nodename);
  10.         printf("%s\n",pa->release);
  11.         printf("%s\n",pa->version);
  12.         printf("%s\n",pa->machine);

  13. exit(0);
  14. }
复制代码

  1. XXX@XXX:/bak/cai$ ./a.out
  2. uname error: Bad address
复制代码
发表于 2007-3-5 21:38:14 | 显示全部楼层
楼主太浮躁了,程序都没有写对,给出我改的代码和运行结果。


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/utsname.h>

  4. int main(void)
  5. {
  6.     struct utsname *pa;

  7.     if (uname(pa) < 0)
  8.         printf("uname error");

  9.     printf("%s\n", pa->sysname);
  10.     printf("%s\n", pa->nodename);
  11.     printf("%s\n", pa->release);
  12.     printf("%s\n", pa->version);
  13.     printf("%s\n", pa->machine);

  14.     exit(0);
  15. }

复制代码


  1. $ ./uname
  2. Linux
  3. RAYS
  4. 2.6.17-2-686
  5. #2 SMP Mon Aug 28 15:33:43 CST 2006
  6. i686
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-3-6 21:39:52 | 显示全部楼层
唉!执行结果对不等于程序对。
两个程序都没有给pa分配内存,pa是随机,所以可能正确运行
也可能错误。
回复 支持 反对

使用道具 举报

发表于 2007-3-7 11:48:05 | 显示全部楼层
言之有理,我也太浮躁了!

奇怪的是在我的机器上运行一直正常,所以这种错误就被忽略了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-7 21:11:44 | 显示全部楼层
明白错在哪了,系统提示 “uname error: Bad address” 是因为没有给pa指针没分配内存无法运行,给pa分配内存后就行了

  1. #include        "apue.h"
  2. #include        <sys/utsname.h>

  3. int        main(void)
  4. {
  5.         struct utsname        *pa;
  6.        
  7.         if ((pa = calloc(sizeof(struct utsname), MAXLINE)) == NULL)
  8.                 err_sys("calloc error");

  9.         if (uname(pa) < 0)
  10.                 err_sys("uname error");

  11.         printf("%s\n",pa->sysname);
  12.         printf("%s\n",pa->nodename);
  13.         printf("%s\n",pa->release);
  14.         printf("%s\n",pa->version);
  15.         printf("%s\n",pa->machine);

  16. exit(0);
  17. }
复制代码

  1. XX@XX:/bak/cai$ ./a.out
  2. Linux
  3. XX
  4. 2.6.17-2-686
  5. #1 SMP Wed Sep 13 16:34:10 UTC 2006
  6. i686
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-3-14 09:20:12 | 显示全部楼层
请问楼主, apue.h哪里来?
MAXLINE又是哪里来的呢?
回复 支持 反对

使用道具 举报

发表于 2007-3-14 09:22:24 | 显示全部楼层
我晕啊,还有那个err_sys函数呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表