LinuxSir.cn,穿越时空的Linuxsir!

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

APUE2里15-2程序异常出错,高手帮看看

[复制链接]
发表于 2007-6-15 02:24:32 | 显示全部楼层 |阅读模式
下面这个代码是我照着APUE2的第十五章的15-2例子写的,可是在执行的时候直接就死掉了,我用echo $?得到141,这个按我的理解应该是141-128=13,也就是权限出错吧,可是我查看了一下,权限没问题,请大家帮我调试一下,看哪里出的问题,谢谢

  1. #include <sys/wait.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <errno.h>

  7. #define        DEF_PAGER        "/bin/more"
  8. #define        MAX_LINE        2048

  9. int
  10. main(int argc, char *argv[])
  11. {
  12.         int        n;
  13.         int        fd[2];
  14.         pid_t        pid;
  15.         char        *pager, *argv0;
  16.         char        line[MAX_LINE];
  17.         FILE        *fp;
  18.        
  19.         if (argc != 2) {
  20.                 printf("usage: %s <filename>\n", argv[0]);
  21.                 exit(1);
  22.         }
  23.        
  24.         if ((fp = fopen(argv[1], "r")) == NULL) {
  25.                 printf("open %s failed: %s\n", argv[1], strerror(errno));
  26.                 exit(1);
  27.         }
  28.        
  29.         if (pipe(fd) < 0) {
  30.                 printf("create pipe failed: %s\n", strerror(errno));
  31.                 exit(1);
  32.         }
  33.        
  34.         if ((pid = fork()) < 0) {
  35.                 printf("%d fork failed: %s\n", getpid(), strerror(errno));
  36.                 exit(1);
  37.         } else if (pid > 0) {
  38.                 close(fd[0]);
  39.                 while (fgets(line, MAX_LINE, fp) != NULL) {
  40.                         n = strlen(line);
  41.                         if (write(fd[1], line, n) != n) {
  42.                                 printf("write failed: %s\n", strerror(errno));
  43.                                 exit(1);
  44.                         }
  45.                 }
  46.                
  47.                 if (ferror(fp)) {
  48.                         printf("read %s failed: %s\n", argv[1], strerror(errno));
  49.                         exit(1);
  50.                 }
  51.                
  52.                 close(fd[1]);

  53.                 if ((waitpid(pid, NULL, 0)) < 0) {
  54.                         printf("wait %d failed: %s\n", pid, strerror(errno));
  55.                         exit(1);
  56.                 }
  57.                
  58.                 exit(0);
  59.         } else {
  60.                 close(fd[1]);
  61.                
  62.                 if (fd[0] != STDIN_FILENO) {
  63.                         if ((dup2(fd[0], STDIN_FILENO)) != STDIN_FILENO) {
  64.                                 printf("dup2 failed: %s\n", strerror(errno));
  65.                                 exit(1);
  66.                         }
  67.                         close(fd[0]);
  68.                 }
  69.                
  70.                 if ((pager = getenv("PAGER")) != NULL) {
  71.                         pager = DEF_PAGER;
  72.                 }
  73.                
  74.                 if ((argv0 = strrchr(pager, '/')) == NULL)
  75.                         argv0 = pager;
  76.                 else
  77.                         argv0++;
  78.                
  79.                 if ((execl(pager, argv0, (char *)0)) < 0) {
  80.                         printf("execl %s failed: %s\n", pager, strerror(errno));
  81.                         exit(1);
  82.                 }
  83.         }
  84.         exit(0);
  85. }

复制代码
 楼主| 发表于 2007-6-15 02:36:07 | 显示全部楼层
下面是我用gdb ./a.out a调试的结果(a的内容是"aaa"三个字符)

  1. GNU gdb 6.4.90-debian
  2. Copyright (C) 2006 Free Software Foundation, Inc.
  3. GDB is free software, covered by the GNU General Public License, and you are
  4. welcome to change it and/or distribute copies of it under certain conditions.
  5. Type "show copying" to see the conditions.
  6. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  7. This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

  8. "/home/ice/work/source/15/a" is not a core dump: 不可识别的文件格式
  9. (gdb) r
  10. Starting program: /home/ice/work/source/15/a.out
  11. Failed to read a valid object file image from memory.
  12. usage: /home/ice/work/source/15/a.out <filename>

  13. Program exited with code 01.
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-16 15:21:52 | 显示全部楼层
解决了,不好意思,自己太粗心了

  1. if ((pager = getenv("PAGER")) != NULL) {
  2.                          pager = DEF_PAGER;
  3.                  }
复制代码

改为

  1. if ((pager = getenv("PAGER")) == NULL) {
  2.                          pager = DEF_PAGER;
  3.                  }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-7-1 20:12:25 | 显示全部楼层
...........
看来粗心是大多数人的权利啊,真幸福,我也有这个权利
回复 支持 反对

使用道具 举报

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

本版积分规则

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