2017-11-26 3 views
0

Wenn ich gcc ioctl.c verwenden Ich habe erors:

iostl.c: 29: 13: Warnung: implizite Deklaration der Funktion 'ioctl' [-Wimplicit-function-Erklärung]
RET_VAL = ioctl (file_desc, IOCTL_SET_MSG, Nachricht);
iostl.c: 80: 15: Warnung: implizite Deklaration der Funktion 'open' [-Wimplicit-function-declaration]
file_desc = öffnen (DEVICE_FILE_NAME, 0);
Was ist los?implizite Deklaration der Funktion 'ioctl'

ioctl.c:

#include </usr/include/linux/fcntl.h> 
#include </usr/include/x86_64-linux-gnu/sys/stat.h> 
#include </usr/include/linux/ioctl.h>  
#include </usr/include/unistd.h>  
#include </usr/include/stdio.h> 
#include </usr/include/stdlib.h> 

static int ioctl_set_msg(int file_desc, char *message); 
static int ioctl_get_msg(int file_desc); 
static int ioctl_get_nth_byte(int file_desc); 

/* Functions for the ioctl calls */ 
int ioctl_set_msg(int file_desc, char *message) 
{ 
    int ret_val; 

    ret_val = ioctl(file_desc, IOCTL_SET_MSG, message); 
    if (ret_val < 0) { 
     printf ("ioctl_set_msg failed:%d\n", ret_val); 
     exit(-1); 
    } 
} 

int ioctl_get_msg(int file_desc) 
{ 
    int ret_val; 
    char message[100]; 
    ret_val = ioctl(file_desc, IOCTL_GET_MSG, message); 
    if (ret_val < 0) { 
    printf ("ioctl_get_msg failed:%d\n", ret_val); 
    exit(-1); 
    } 
    printf("get_msg message:%s\n", message); 
} 

int ioctl_get_nth_byte(int file_desc) 
{ 
    int i; 
    char c; 
    printf("get_nth_byte message:"); 
    i = 0; 
    while (c != 0) { 
     c = ioctl(file_desc, IOCTL_GET_NTH_BYTE, i++); 
     if (c < 0) { 
     printf("ioctl_get_nth_byte failed at the %d'th byte:\n", i); 
     exit(-1); 
    } 
    putchar(c); 
    } 
    putchar('\n'); 
} 


int main() 
{ 
    int file_desc, ret_val; 
    char *msg = "Message passed by ioctl\n"; 
    file_desc = open(DEVICE_FILE_NAME, 0); 
    if (file_desc < 0) { 
    printf ("Can't open device file: %s\n", DEVICE_FILE_NAME); 
    exit(-1); 
    } 
    ioctl_get_nth_byte(file_desc); 
    ioctl_get_msg(file_desc); 
    ioctl_set_msg(file_desc, msg); 
    close(file_desc); 
} 

Makefile:

obj-m += iostl.o 
all: 
    make cc -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
    make cc -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 
test:test.c 
    cc -o test test.c 

Befehl zu machen: make -C ./linux- uname -r SUBDIRS = $ PWD Module

+0

Wird die Warnung verschwinden, wenn Sie entfernen '/ usr/include/linux /' von Ihrem '# Include's? – SurvivalMachine

+0

warum achal

+0

Wenn ich/usr/include/linux/dann habe ich: fataler Fehler: ioctl.h nicht gefunden –

Antwort

1

Die include-Anweisungen sind nicht richtig und brauchen keinen vollständigen Pfad. Sie werden wahrscheinlich brauchen:

#include <sys/fcntl.h> 
#include <sys/stat.h> 
#include <sys/ioctl.h>  
#include <unistd.h>  
#include <stdio.h> 
#include <stdlib.h> 
+0

Wow, seine Hilfe mit gcc zu kompilieren sind. können Sie mir helfen mit Makefile? Ich benutze den vollständigen Pfad, weil Makefile mir dies zeigen: iostl.c: 60: 24: fataler Fehler: sys/fcntl.h: nicht gefunden. Jetzt Makefile wieder zeigen Sie mir diesen Fehler. –

+0

Sie verwenden ein Makefile, das beabsichtigt ist zum Schreiben von Linux-Kernel-Modulen, während Ihr Programm ein normales Userspace-Programm zu sein scheint, beginnen Sie bei Null und schreiben Sie ein neues Makefile - das Makefile y Sie verwenden jetzt ist für etwas völlig anderes gedacht, können Sie nicht Ihr Programm kompilieren sauber mit diesem Makefile – nos

+0

Vielen Dank, jetzt habe ich verstanden. –

Verwandte Themen