2012-04-20 65 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