주어진 입력에 대해 파일을 검색하기 위해 시스템 호출을 작성했습니다. 하지만 내 코드가 sys_read()
제대로 작동하지 않아서 작동하지 않습니다.
#include <linux/kernel.h>
#include <linux/unistd.h>
#include <asm/unistd.h>
#include <linux/fcntl.h>
#include <linux/syscalls.h>
asmlinkage long sys_search_phrase(int fd, char *phrase, char *buffer, int line)
{
printk("Search was here\n");
char arr[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
char *temp = arr;
int i = 0;
int temp_line = 1;
while(sys_read(fd, &temp[i], 1) == 1){
if(temp[i] == '\n' || temp[i] == 0x0 || temp[i] == '\0'){
temp[i] = 0;
if(i != 0){
//buffer now has a line
if(line <= 0 && contains(temp, phrase)) {
copy(buffer, temp);
return temp_line;
}
else if(line == temp_line && contains(temp, phrase)) {
copy(buffer, temp);
return temp_line;
}
temp_line++;
}
i=0;
continue;
}
i++;
}
return -1;
}
그래서 디버그 코드를 사용해 보았는데 printk()
내 프로그램이 while
루프에 들어가지 않는다는 것을 발견했습니다.
커널 v4.4.202 우분투 16.04
답변1
sys_read()
커널의 버퍼를 사용하여 호출 할 수 없으며 두 번째 인수로 사용자 가상 주소가 필요합니다.
커널 API가 있습니다.kernel_read()
, 커널 공간에서 사용할 수 있습니다.