Используйте SYS_getcwd в c для Ubuntu - PullRequest
0 голосов
/ 02 февраля 2011

Я пытаюсь получить текущий рабочий каталог в Ubuntu, используя следующий код:

#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
#include<stdlib.h>
int main(){
    char *str = malloc(100);
    str=(char *)   syscall(SYS_getcwd);
    printf("%s",str);
    return 0;
}

Однако я получаю ошибку сегментации и не могу напечатать pwd.Пожалуйста, помогите мне, как правильно использовать sys_getcwd

Ответы [ 3 ]

1 голос
/ 02 февраля 2011

Если вы хотите использовать функцию getcwd, это небольшой пример:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
    char *str = (char *)malloc(100);

        if(str){
            if ( getcwd(str, 99) == str)
                printf("%s\n", str);
            free(str);
        }

        return 0;
}

Ну, то же самое с вашим примером:

#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
#include<stdlib.h>
int main(){
    char *str = malloc(100);
    if (syscall(SYS_getcwd, str) == 0)
        printf("%s",str);

    free(str);
    return 0;
}

На этой странице вы можете прочитать man-страницуфункции syscall: http://www.kernel.org/doc/man-pages/online/pages/man2/syscall.2.html

Как видите, первый аргумент - это номер системного вызова, и в этом случае второй аргумент e - это ваша строка, в которую функция syscall помещает значение.

1 голос
/ 02 февраля 2011

Это неправильно, неправильно неправильно.

Прежде всего, почему вы выделяете 100 байтов, если не собираетесь использовать это пространство памяти?Сначала вы присваиваете указатель str пространству malloc, а затем переназначаете его на возвращаемое значение SYS_getcwd.

Во-вторых, как, по вашему мнению, будет работать системный вызов, возвращающий строку?В вашей текущей настройке вы должны представить, что она где-то выделяет свою память и возвращает указатель на вас.Спросите себя: «Зачем это нужно?»

Какой метод большинство C функций используют для возврата строки?

Подсказка: вы должны передать указатель на вашбуфер для системного вызова.Затем он запишет ответ в буфер.Возвращаемым значением является код состояния или ошибки.

Подсказка № 2: Вам следует прочитать документацию!Что такое параметр second , который следует передать системному вызову?

0 голосов
/ 02 февраля 2011

У вас есть причина, на этой странице не отображаются другие аргументы.

Смотрите это: http://asm.sourceforge.net/syscall.html

и смотрите sys_getcwd(char *buf, unsigned long size).функция системного вызова принимает системный вызов и его аргументы.В этом примере sys_getcwd имеет два аргумента: буфер для установки значения и размер буфера.В моем первом примере я забыл параметр "size".

Вы понимаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...