Tôi đã viết một cuộc gọi hệ thống tùy chỉnh cho một nhiệm vụ so sánh hai số nguyên và trả về số nguyên lớn nhất. Dưới đây là mã của tôi kernel-side (max.c):Linux - Tại sao cuộc gọi hệ thống tùy chỉnh hoạt động không đúng với số âm?
#include <linux/kernel.h>
#include <linux/syscalls.h>
asmlinkage long sys_max(int num1, int num2)
{
if (num1 > num2)
{
return num1;
}
else
{
return num2;
}
}
Và đây là mã của tôi sử dụng không gian (max.h):
#include <unistd.h>
#define SYS_MAX 323
int max(int num1, int num2)
{
int maxnumber = syscall(SYS_MAX, num1, num2);
return maxnumber;
}
Tôi đang sử dụng chương trình này ít để kiểm tra hệ thống gọi:
#include <stdio.h>
#include <max.h>
int main()
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("%d", max(a, b));
return 0;
}
Nó hoạt động tốt cho số dương hoặc khi dương và âm kia, nhưng luôn trả về -1 khi xử lý hai giá trị âm. Tôi đã tự hỏi liệu điều này có phải là do chuyển đổi dài hay không, nhưng dường như tôi không thể hiểu được nguyên nhân gây ra vấn đề.
'int max (int num1, int num2) {}' - đó là định nghĩa hàm chứ không phải khai báo. Ý bạn là 'int max (int, int);'? – melpomene
Có gì thay đổi nếu bạn đổi tên hàm 'max' thành' mymax' không? – melpomene
@melpomene Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi, vì vậy tôi không chắc đó là từ thích hợp ở đây. Nhưng vấn đề là hàm max phải trả về một số nguyên và nhận hai số nguyên làm tham số. –