如何使用系统调用阅读?分段错误(核心转储)错误

时间:2017-01-25 22:37:24

标签: c linux system system-calls

我可能会因为某种错误而使用我的读取功能,但我无法识别它。

#include <unistd.h>
#include <sys/sysinfo.h>
#include <sys/syscall.h>

void exitProgram()
{
    syscall(SYS_write, 1, "norma", slen("norma"));
    syscall(SYS_exit, 1 , 0);
}

int main()
{
    func_desc arr[2];
    int choice;

    arr[0].name = "exit";
    arr[0].func = &exitProgram;

    syscall(SYS_write, 1, "Choose: ", slen("Choose: "));

    syscall(SYS_read, 0, choice, sizeof(choice));

    arr[choice-1].func();

    return 0;
}

如果选择为'1'则应调用exitProgram(),而是调用Segmentation fault(core dumped)。当我写一个特定的数字然后它起作用(例子):

arr[0].func();

如何解决此分段错误(核心转储)问题?

1 个答案:

答案 0 :(得分:0)

#include <unistd.h>
#include <sys/sysinfo.h>
#include <sys/syscall.h>
#include <string.h>

void exitProgram()
{
    syscall(SYS_write, 1, "norma", strlen("norma"));
    syscall(SYS_exit, 1 , 0);
}

typedef struct func_desc {
    char const *name;
    void (*func)(void);
} func_desc;

int main()
{
    func_desc arr[2];
    char choice;

    arr[0].name = "exit";
    arr[0].func = &exitProgram;

    syscall(SYS_write, 1, "Choose: ", strlen("Choose: "));

    syscall(SYS_read, 0, &choice, sizeof(choice));

    arr[choice-'0'-1].func();

    return 0;
}

这样可行(仅当您输入数字1时才正确)。

read采用以下参数:

   ssize_t read(int fd, void *buf, size_t count);

使用这个glibc read包装器可能是明智的(它肯定会阻止你传递一个指向预期的int)。