|
下面这个代码是我照着APUE2的第十五章的15-2例子写的,可是在执行的时候直接就死掉了,我用echo $?得到141,这个按我的理解应该是141-128=13,也就是权限出错吧,可是我查看了一下,权限没问题,请大家帮我调试一下,看哪里出的问题,谢谢
- #include <sys/wait.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #define DEF_PAGER "/bin/more"
- #define MAX_LINE 2048
- int
- main(int argc, char *argv[])
- {
- int n;
- int fd[2];
- pid_t pid;
- char *pager, *argv0;
- char line[MAX_LINE];
- FILE *fp;
-
- if (argc != 2) {
- printf("usage: %s <filename>\n", argv[0]);
- exit(1);
- }
-
- if ((fp = fopen(argv[1], "r")) == NULL) {
- printf("open %s failed: %s\n", argv[1], strerror(errno));
- exit(1);
- }
-
- if (pipe(fd) < 0) {
- printf("create pipe failed: %s\n", strerror(errno));
- exit(1);
- }
-
- if ((pid = fork()) < 0) {
- printf("%d fork failed: %s\n", getpid(), strerror(errno));
- exit(1);
- } else if (pid > 0) {
- close(fd[0]);
- while (fgets(line, MAX_LINE, fp) != NULL) {
- n = strlen(line);
- if (write(fd[1], line, n) != n) {
- printf("write failed: %s\n", strerror(errno));
- exit(1);
- }
- }
-
- if (ferror(fp)) {
- printf("read %s failed: %s\n", argv[1], strerror(errno));
- exit(1);
- }
-
- close(fd[1]);
- if ((waitpid(pid, NULL, 0)) < 0) {
- printf("wait %d failed: %s\n", pid, strerror(errno));
- exit(1);
- }
-
- exit(0);
- } else {
- close(fd[1]);
-
- if (fd[0] != STDIN_FILENO) {
- if ((dup2(fd[0], STDIN_FILENO)) != STDIN_FILENO) {
- printf("dup2 failed: %s\n", strerror(errno));
- exit(1);
- }
- close(fd[0]);
- }
-
- if ((pager = getenv("PAGER")) != NULL) {
- pager = DEF_PAGER;
- }
-
- if ((argv0 = strrchr(pager, '/')) == NULL)
- argv0 = pager;
- else
- argv0++;
-
- if ((execl(pager, argv0, (char *)0)) < 0) {
- printf("execl %s failed: %s\n", pager, strerror(errno));
- exit(1);
- }
- }
- exit(0);
- }
复制代码 |
|