2017-01-25 14 views
-1

Я, вероятно, использую свою функцию чтения с какой-то ошибкой, но не могу ее распознать.Как пользоваться системным вызовом Читать? Ошибка скрещения сегментации (ядро сбрасывается)

#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(); 

Как я могу исправить эту ошибку сегментации (ядро сбрасывали) проблемы?

+0

Шаг 1. Проверьте возвращаемое значение всех системных вызовов, чтобы убедиться в их успешности. Шаг 2. Проверьте, что на самом деле находится в 'выборе', прежде чем использовать его. – melpomene

+0

Кроме того, попробуйте получить этот код, работающий с 'fread',' fwrite' и 'exit', прежде чем вы начнете возиться с syscalls. – melpomene

+0

Вы уверены в этих аргументах для 'read'? –

ответ

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, где, как ожидается, указатель).