Пример realpath функционирует в C

Каково различие между кока-колой и Пепси?

хорошо, это не действительно настолько подобно, но много различий находится качественными способами. Разговор о Netbeans 6.1 и 6.5:

  • Netbeans имеет совсем другой UI и рабочий процесс. Нет никаких перспектив, но панели инструментов и такое автоматическое желание кажутся/скрывают по мере необходимости (т.е. отлаживающий). Процесс сборки отличается. Руководящие проекты отличаются.

  • Netbeans иногда фокусируется на гладком, интегрированном опыте за счет функций. Профилировщик полностью интегрируется в редактора (контекстное меню позволило Вам быстро управлять профилировщиком), но испытывает недостаток в некоторых функциях профилировщиков Eclipse.

  • Netbeans имеет тесно интегрированную JSP/Servlet/JSF среду разработки. Целый рабочий процесс соединяется вместе от разработки, отладки, развертывания. Это - больше "чувства", чем что-либо еще.

  • редактор Netbeans пропускает несколько функций Eclipse. Проверьте правописание быть одним видным. Быстрый завершенный (Ctrl-K, Ctrl-J) недогруженная функция Netbeans. Отрывки, являющиеся другим (хотя у них есть шаблон автоматического заполнения, который заполняет различную, но подобную нишу).

  • Меньше выбора. Если Вам не нравится один из включенных инструментов, маловероятно, что Вы найдете хороший альтернативный плагин.

  • Matisse. Редакторы GUI Eclipse начали нагонять, но они не просто никакое сравнение с Matisse. Поверхностно, они кажутся эквивалентными...

  • <sarcasm> Ваши друзья высмеют Вас. </sarcasm>

14
задан jww 7 February 2019 в 23:37
поделиться

3 ответа

Функция realpath () сообщает вам путь к файлу, когда все символические ссылки разрешены. Это не обязательно абсолютный путь, если значение, которое вы предоставляете, является относительным именем, но это частично зависит от того, пересекаете ли вы какие-либо символические ссылки с абсолютными именами для значения ссылки - если вы это сделаете, то в конце концов вывод будет абсолютным именем . Кроме того, если относительное имя проходит до корневого каталога (или «за его пределами», как в «../../../../../ ..», когда только три уровня в иерархии каталогов).

Возможно, на вашем компьютере уже есть программа realpath. Вот (нестандартная) версия, которую я написал.

/*
@(#)File:           $RCSfile: realpath.c,v $
@(#)Version:        $Revision: 1.3 $
@(#)Last changed:   $Date: 2007/10/23 20:23:44 $
@(#)Purpose:        Command to evaluate realpath(3) on given arguments.
@(#)Author:         J Leffler
@(#)Copyright:      (C) JLSS 2007
@(#)Product:        :PRODUCT:
*/

/*TABSTOP=4*/

#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */

#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include "stderr.h"

static const char optstr[] = "hlsV";
static const char usestr[] = "[-hslV] given-path [...]";
static const char hlpstr[] =
    "  -h   Print this help message\n"
    "  -l   Long format: print given-path and real-path\n"
    "  -s   Short format: print just real-path\n"
    "  -V   Print version and exit\n"
    ;

enum { FMT_LONG, FMT_SHORT };
static int format_type = FMT_LONG;

#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_realpath_c[];
const char jlss_id_realpath_c[] = "@(#)$Id: realpath.c,v 1.3 2007/10/23 20:23:44 jleffler Exp $";
#endif /* lint */

static int eval_realpath(const char *given)
{
    char realname[_POSIX_PATH_MAX];
    int rc = 0;

    if (realpath(given, realname) == 0)
    {
        rc = -1;
        err_sysrem("failed to resolve real path name for %s\n", given);
    }
    else if (format_type == FMT_SHORT)
        printf("%s\n", realname);
    else
        printf("%s %s\n", given, realname);
    return(rc);
}

int main(int argc, char **argv)
{
    int i;
    int rc = EXIT_SUCCESS;
    int opt;

    err_setarg0(argv[0]);
    while ((opt = getopt(argc, argv, optstr)) != -1)
    {
        switch (opt)
        {
        case 'V':
            err_version("REALPATH", &"@(#)$Revision: 1.3 $ ($Date: 2007/10/23 20:23:44 $)"[4]);
            break;
        case 'h':
            err_help(usestr, hlpstr);
            break;
        case 'l':
            format_type = FMT_LONG;
            break;
        case 's':
            format_type = FMT_SHORT;
            break;
        default:
            err_usage(usestr);
            break;
        }
    }

    for (i = optind; i < argc; i++)
    {
        if (eval_realpath(argv[i]) != 0)
            rc = EXIT_FAILURE;
    }

    return(rc);
}

Мне она понадобилась для тестирования некоторого программного обеспечения, которое оценивало безопасность пути, и нужно было убедиться, что мой код оценивает данный путь к тому же разрешенному месту, что и realpath () . Вероятно, было бы разумно расширить его с помощью опции '-a', чтобы имена были сопоставлены с абсолютными именами (путем добавления префикса результата getcwd () к относительным путям).

(Источник для stderr .c, stderr.h можно найти в Интернете, если вы знаете, где искать. Или свяжитесь со мной - см. мой профиль.)

3
ответ дан 1 December 2019 в 10:03
поделиться

Функция realpath () не описана в стандарте C. Однако он описан в POSIX 1997 и POSIX 2008 . Если вы это имеете в виду, то вот пример:

#include <limits.h> /* PATH_MAX */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    char buf[PATH_MAX]; /* PATH_MAX incudes the \0 so +1 is not required */
    char *res = realpath("this_source.c", buf);
    if (res) {
        printf("This source is at %s.\n", buf);
    } else {
        perror("realpath");
        exit(EXIT_FAILURE);
    }
    return 0;
}

PATH_MAX определен в ( из POSIX 1997 )

20
ответ дан 1 December 2019 в 10:03
поделиться

Вот так:

int main(int argc, char *argv[]) {
    ...
    char *symlinkpath = argv[1];
    char actualpath [PATH_MAX];
    char *ptr;
    ptr = realpath(symlinkpath, actualpath);
    ...
}

Заимствовано из здесь

0
ответ дан 1 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: