2012-04-20 64 views
0

我想在Linux下爲read()編寫一個包裝函數。read()的包裝函數不能編譯

請寬容我,因爲這是我第一次使用包裝器:)

鑑於代碼my_wrappers.c文件:

#include "my_wrappers.h" 
#include <unistd.h> 
#include <sys/types.h> 

ssize_t my_read (int fd, void *buf, size_t count) 
{ 
    long ret; 
    extern int errno; 

    __asm__ __volatile__ ("pushl %%ebx\n\t" 
         "movl %%esi,%%ebx\n\t" 
         "int $0x80\n\t" 
         "popl %%ebx" 
         : "=a" (ret) 
         : "0" (SYS_read), "S" ((long) fd), 
         "c" ((long) buf) "d" ((long) count): "bx"); 
    if (ret >= 0) 
    { 
    return (int) ret; 
    } 
    errno = -ret; 
    return -1; 
} 

my_wrappers.h文件:

#ifndef __MY_WRAPPERS_H_ 
#define __MY_WRAPPERS_H_ 

#include <unistd.h> 
#include <sys/types.h> 


int my_open(const char *pathname, int flags, mode_t mode); 
ssize_t my_write(int fd, const void *buf, size_t count); 
ssize_t my_read(int fd, void *buf, size_t count); 
int my_close(int fd); 

pid_t my_fork(void); 

#endif 

我'只允許使用呼叫libc包裝,即我不允許打開(),讀取()等。

這段代碼有什麼問題?也許是因爲我沒有使用系統調用表的號碼?

Eclipse中的錯誤: - ‘SYS_read’ undeclared (first use in this function)

問候

羅恩

回答

3

您需要#include <syscall.h>或可能#include <sys/syscall.h>

+0

它是必須的?講師說:#include &#include ron 2012-04-20 04:49:57

+0

沒有它,編譯器不能看到'SYS_read()'的聲明。你的其他選擇是爲它提供'extern'聲明。在實踐中,最好包括頭文件,但如果你的老師堅持,你可以使用'extern'。 – Sean 2012-04-20 04:55:21

+0

我沒有找到你,你的意思是在「0」(SYS_read)之前添加「extern」? – ron 2012-04-20 05:10:56