我有一个系统调用读取,如下所示:
ssize_t serp_read(struct file *filep, char __user *buf, size_t count, loff_t *offp){
ssize_t cnt;
char *buffer;
int i;
buffer = kmalloc(count * sizeof(char), GFP_KERNEL);
for (i = 0; i != count; ++i) {
buffer[i] = UART_read();
if(buffer[i] == '\n')
break;
}
cnt = copy_to_user(buf, buffer, i);
kfree(buffer);
if(cnt) {
printk("Error in copy_to_user() cnt is %d\n", cnt);
i -= cnt; /* bytes successfully copied */
}
return i;
}
而 UART_read() 是
unsigned char UART_read(void){
unsigned int buf;
if( ( inb(UART + UART_LSR) & UART_LSR_FE ) == 1){
printk("KERNEL - Framing error"); return -1;}
else if( ( inb(UART + UART_LSR) & UART_LSR_PE ) == 1){
printk("KERNEL - Parity error"); return -1;}
else if( ( inb(UART + UART_LSR) & UART_LSR_OE ) == 1){
printk("KERNEL - Overrun error"); return -1;}
while( ( ( inb(UART_LSR + UART) ) & UART_LSR_DR ) == 0 ){
schedule();
}
buf = inb(UART);
return (char)buf;
}
在我的测试程序中我调用它
rb = read(fd, buffer, sizeof(buffer));
if ( rb < 0){
perror("Error");
}
else {
buffer[rb] = '\0';
}
因此,从我在测试程序中调用它的那一刻起,除非 UART 得到一些字符,否则我无法退出。但我希望能够中断这个过程。我可以做一个普通的处理程序来处理 CTRL-C 吗?还是我必须为相同的效果做一些不同的事情?如果调用了处理程序,那么内核程序之后会去哪里?或者如果我在测试程序中有一个普通的处理程序,内核会发生什么?它会起作用吗?
此外,内核代码是一个程序,而测试程序完全是另一个程序。