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