Передача параметров системным вызовам - PullRequest
6 голосов
/ 24 апреля 2011

Я сделал базовый пример системного вызова helloWorld, который не имел параметров и был просто:

int main()
{
   syscall(__NR_helloWorld);
   return 0;
}

Но сейчас я пытаюсь выяснить, как передать фактические аргументы системному вызову (т. Е. A long).Какой именно формат, я попробовал:

int main()
{
   long input = 1;
   long result = syscall(__NR_someSysCall, long input, long);
   return 0;
}

Где он принимает long и возвращает long, но он не компилируется правильно;какой правильный синтаксис?

Ответы [ 2 ]

4 голосов
/ 24 апреля 2011

Удалить названия типов. Это просто вызов функции. Пример:

#include <sys/syscall.h>
#include <unistd.h>

int main( int argc, char* argv[] ) {
    char str[] = "boo\n";
    syscall( __NR_write, STDOUT_FILENO, str, sizeof(str) - 1 );
    return 0;
}
2 голосов
/ 24 апреля 2011

Прототип для syscall составляет

   #define _GNU_SOURCE        /* or _BSD_SOURCE or _SVID_SOURCE */
   #include <unistd.h>
   #include <sys/syscall.h>   /* For SYS_xxx definitions */

   int syscall(int number, ...);

Это говорит о том, что требуется переменное число (и тип) параметров. Это зависит от конкретного системного вызова. syscall не является нормальным интерфейсом для определенного системного вызова. Они могут быть явно закодированы, например write(fd, buf, len).

...