【问题标题】:How to use system call Read? Segmentation fault (core dumped) error如何使用系统调用Read?分段错误(核心转储)错误
【发布时间】:2017-01-25 22:37:23
【问题描述】:

我可能在使用我的读取功能时出现了某种错误,但我无法识别它。

#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(),但它会显示分段错误(核心转储)。当我写一个特定的数字时,它就会起作用(示例):

arr[0].func();

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

【问题讨论】:

  • 第一步:检查所有系统调用的返回值,确保它们成功。第 2 步:在使用之前检查 choice 中的实际内容。
  • 另外,在你开始搞乱系统调用之前,不妨尝试让这段代码与freadfwriteexit 一起工作。
  • 你确定read 的那些论点吗?
  • 试试syscall(SYS_read, 0, (void*)&amp;choice, sizeof(choice));
  • @melpomene:这可能不是消息,但至少 OP 可以在系统调用周围使用 glibc 包装器......

标签: c linux system system-calls


【解决方案1】:
#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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多