Napisałem niestandardowe wywołanie systemowe dla przypisania, które porównuje dwie liczby całkowite i zwraca największą wartość. Tu jest mój kodu po stronie jądra (max.c):Linux - Dlaczego niestandardowe wywołanie systemowe nie działa poprawnie z liczbami ujemnymi?
#include <linux/kernel.h>
#include <linux/syscalls.h>
asmlinkage long sys_max(int num1, int num2)
{
if (num1 > num2)
{
return num1;
}
else
{
return num2;
}
}
A oto mój kod przestrzeni użytkownika (max.h):
#include <unistd.h>
#define SYS_MAX 323
int max(int num1, int num2)
{
int maxnumber = syscall(SYS_MAX, num1, num2);
return maxnumber;
}
Używam ten mały program do testowania systemu zadzwoń:
#include <stdio.h>
#include <max.h>
int main()
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("%d", max(a, b));
return 0;
}
to działa świetnie dla liczb dodatnich, lub gdy jeden jest dodatni, a drugi ujemny, ale max zawsze zwraca -1 gdy mamy do czynienia z dwiema wartościami ujemnymi. Zastanawiałem się, czy to z powodu int-> długiej konwersji, ale nie mogę zrozumieć, co powoduje problem.
'int max (int num1, int num2) {}' - to definicja funkcji, a nie deklaracja. Czy chodziło Ci o 'int max (int, int);'? – melpomene
Czy coś się zmieni, jeśli zmienisz nazwę funkcji 'max' na' mymax'? – melpomene
@melpomene Angielski nie jest moim ojczystym językiem, więc nie jestem pewien, jakie jest właściwe słowo. Ale chodzi o to, że funkcja max musi zwracać liczbę całkowitą i otrzymywać dwie liczby całkowite jako parametry. –