Расширенное программирование в среде Unix: получение ограничений конфигурации Рисунок 2.12 «Программа сборки C для печати всех поддерживаемых ограничений конфигурации» - PullRequest
2 голосов
/ 17 декабря 2011

Автор утверждает, что его скрипт awk распечатает все ограничения для POSIX.1 и XSI-совместимой системы. Я использую Red Hat Enterprise Linux Server версии 6.0 (Сантьяго). Когда я запускаю его awk-скрипт, он, похоже, не печатает часть #ifdef программы на Си. Я думаю, что sysconf.sym не существует в этом дистрибутиве, поэтому циклы while никогда не запускаются. Может ли кто-нибудь подтвердить это? Если это так, какие изменения мне нужно внести в скрипт awk, чтобы он распечатал часть кода #ifdef? Скрипт awk:

# Run with awk -f <awk_script>

BEGIN   {
    printf("#include \"apue.h\"\n")
    printf("#include <errno.h>\n")
    printf("#include <limits.h>\n")
    printf("#include <stdio.h>\n")
    printf("\n")

    printf("int log_to_stderr = 0;\n")

    printf("static void pr_sysconf(char *, int);\n")
    printf("static void pr_pathconf(char *, char *, int);\n")
    printf("\n")
    printf("int\n")
    printf("main(int argc, char *argv[])\n")
    printf("{\n")
    printf(" if (argc != 2)\n")
    printf("  err_quit(\"usage: a.out <dirname>\");\n\n")
    FS="\t+"
    while (getline <"sysconf.sym" > 0) {
        printf("#ifdef %s\n", $1)
        printf(" printf(\"%s defined to be %%d\\n\", %s+0);\n", $1, $1)
        printf("#else\n")
        printf(" printf(\"no symbol for %s\\n\");\n", $1)
        printf("#endif\n")
        printf("#ifdef %s\n", $2)
        printf(" pr_sysconf(\"%s =\", %s);\n", $1, $2)
        printf("#else\n")
        printf(" printf(\"no symbol for %s\\n\");\n", $2)
        printf("#endif\n")
    }
    close("sysconf.sym")
    while (getline <"pathconf.sym" > 0) {
        printf("#ifdef %s\n", $1)
        printf(" printf(\"%s defined to be %%d\\n\", %s+0);\n", $1, $1)
        printf("#else\n")
        printf(" printf(\"no symbol for %s\\n\");\n", $1)
        printf("#endif\n")
        printf("#ifdef %s\n", $2)
        printf(" pr_pathconf(\"%s =\", argv[1], %s);\n", $1, $2)
        printf("#else\n")
        printf(" printf(\"no symbol for %s\\n\");\n", $2)
        printf("#endif\n")
    }
    close("pathconf.sym")
    exit
}
END {
    printf(" exit(0);\n")
    printf("}\n\n")
    printf("static void\n")
    printf("pr_sysconf(char *mesg, int name)\n")
    printf("{\n")
    printf(" long val;\n\n")
    printf(" fputs(mesg, stdout);\n")
    printf(" errno = 0;\n")
    printf(" if ((val = sysconf(name)) < 0) {\n")
    printf("  if (errno != 0) {\n")
    printf("   if (errno == EINVAL)\n")
    printf("    fputs(\" (not supported)\\n\", stdout);\n")
    printf("   else\n")
    printf("    err_sys(\"sysconf error\");\n")
    printf("  } else {\n")
    printf("   fputs(\" (no limit)\\n\", stdout);\n")
    printf("  }\n")
    printf(" } else {\n")
    printf("  printf(\" %%ld\\n\", val);\n")
    printf(" }\n")
    printf("}\n\n")
    printf("static void\n")
    printf("pr_pathconf(char *mesg, char *path, int name)\n")
    printf("{\n")
    printf(" long val;\n")
    printf("\n")
    printf(" fputs(mesg, stdout);\n")
    printf(" errno = 0;\n")
    printf(" if ((val = pathconf(path, name)) < 0) {\n")
    printf("  if (errno != 0) {\n")
    printf("   if (errno == EINVAL)\n")
    printf("    fputs(\" (not supported)\\n\", stdout);\n")
    printf("   else\n")
    printf("    err_sys(\"pathconf error, path = %%s\", path);\n")
    printf("  } else {\n")
    printf("   fputs(\" (no limit)\\n\", stdout);\n")
    printf("  }\n")
    printf(" } else {\n")
    printf("  printf(\" %%ld\\n\", val);\n")
    printf(" }\n")
    printf("}\n")
}

Обновление

Если вам нужен заголовок apue.h, чтобы вы могли скомпилировать программу на C, которую можно найти по адресу. apue.h

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Я считаю, что sysconf.sym и pathconf.sym должны были быть записаны или поставлены на диск или что-то в этом роде.Прошло много времени с тех пор, как я прочитал APUE.

Обновление: Google открыл следующую ссылку http://www.cs.karelia.ru/~vadim/sp2009/apue.2e/std/

1 голос
/ 17 декабря 2011

Я думаю, что Раго упоминает getconf во 2-м издании APUE. Помимо потери удовольствия от отладки awk, создайте код, предназначенный для удовлетворения ваших задач, и выполняйте его переносимо.

Выезд:

http://pubs.opengroup.org/onlinepubs/009604599/utilities/getconf.html
1 голос
/ 17 декабря 2011

Вам необходимо скачать файлы отсюда: http://www.apuebook.com/sourcecode.html

...