2017-01-25 4 views
-1

Ich benutze wahrscheinlich meine Lesefunktion mit einer Art von Fehler, aber ich kann es nicht erkennen.So verwenden Sie den Systemaufruf Lesen? Segmentierungsfehler (core dumped) Fehler

#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; 
} 

Wenn Wahl '1' ist, dann sollte es exitProgram() aufrufen, sondern sagt, es Segmentation fault (core dumped). Wenn ich eine bestimmte Anzahl schreiben dann funktioniert es (Beispiel):

arr[0].func(); 

Wie kann ich diese Segmentation fault beheben (Core Dump) Problem?

+0

Schritt 1: Überprüfen Sie den Rückgabewert aller Systemaufrufe, um sicherzustellen, dass sie erfolgreich sind. Schritt 2: Überprüfen Sie, was sich tatsächlich in "Wahl" befindet, bevor Sie es verwenden. – melpomene

+0

Versuchen Sie vielleicht auch, diesen Code mit 'fread',' fwrite' und 'exit' zu arbeiten, bevor Sie mit syscalls herumspielen. – melpomene

+0

Sind Sie sich über diese Argumente für 'read' sicher? –

Antwort

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; 
} 

Dies funktioniert (nur genau, wenn Sie die Ziffer 1 eingeben).

read nimmt die folgenden Argumente:

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

Es wahrscheinlich klug sein würde diesen glibc read Wrapper zu verwenden (es Sie sicherlich verhindern würde einen int aus vorbei, wo ein Zeiger erwartet wird).

Verwandte Themen