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)
问候
罗恩
它是必须的?讲师说:#include&#include –
ron
2012-04-20 04:49:57
没有它,编译器不能看到'SYS_read()'的声明。你的其他选择是为它提供'extern'声明。在实践中,最好包括头文件,但如果你的老师坚持,你可以使用'extern'。 – Sean 2012-04-20 04:55:21
我没有找到你,你的意思是在“0”(SYS_read)之前添加“extern”? – ron 2012-04-20 05:10:56