intro

Autres langues

Langue: ja

Version: 1996-05-22 (openSuse - 09/10/07)

Section: 2 (Appels système)

̾Á°

intro, _syscall - ¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÎÀâÌÀ

ÀâÌÀ

¤³¤Î¾Ï¤Ï Linux ¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤òµ­½Ò¤·¤Æ¤¤¤ë¡£ Linux 2.0 ¤Ç¤Ï 164 ¸Ä¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬Â¸ºß¤¹¤ë¡£ syscall(2) ¤ò»²¾È¤Î¤³¤È¡£

ľÀܸƤӽФ¹

¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢Ä¾ÀÜ¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò¸Æ¤Ó½Ð¤¹É¬ÍפϤʤ¤¤¬¡¢ ¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ïɸ½à C ¥é¥¤¥Ö¥é¥ê¤ËŬÀڤʴؿô¤¬¼ÂÁõ¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤â¤¢¤ë¡£ ¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ï¡¢¥×¥í¥°¥é¥Þ¡¼¤Ï¡¢_syscall ¥Þ¥¯¥í¤« syscall() ¤Î¤¤¤º¤ì¤«¤ò»È¤Ã¤Æ¡¢¼«Ê¬¤Ç¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò¸Æ¤Ó½Ð¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ syscall() ¤ò»È¤¦ÊýË¡¤Ë¤Ä¤¤¤Æ¤Ï syscall(2) ¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¡£ ¤³¤Î¥Ú¡¼¥¸¤Ç¤Ï _syscall ¥Þ¥¯¥í¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡£ ¤Þ¤¿¡¢¤¤¤Ä¤É¤Á¤é¤Î»ÅÁȤߤò»È¤¦¤Ù¤­¤«¤Ë¤Ä¤¤¤Æ¤â½Ò¤Ù¤ë¡£

½ñ¼°

#include <linux/unistd.h>

A _syscall macro

desired system call

ÀßÄê

¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ë´Ø¤·¤Æ¤½¤Î¥×¥í¥È¥¿¥¤¥×¤òÃΤ뤳¤È¤¬½ÅÍ×¤Ç ¤¢¤ë¡£°ú¤­¿ô¤Î¸Ä¿ô¡¢¤½¤ì¤é¤Î·¿¡¢¤½¤·¤ÆÊÖ¤êÃͤη¿¤òÃΤé¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ ¼ÂºÝ¤Î»ÈÍѤˤ¢¤¿¤Ã¤Æ¤Ï¡¢¤è¤êÍưפ˥·¥¹¥Æ¥à¤ò¸Æ¤Ó½Ð¤¹¤¿¤á¤Ë¼¡¤Î 6 ¸Ä¤Î ¥Þ¥¯¥í¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡£¤½¤Î·Á¼°¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¢¤ë:
_syscallX(type,name,type1,arg1,type2,arg2,...)
X ¤Ï 0-5 ¤ÎÃͤǡ¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬É¬ÍפȤ¹¤ë°ú¤­¿ô¤Î¿ô¤Ç¤¢¤ë¡£
type ¤Ï¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÎÊÖ¤êÃͤη¿¤Ç¤¢¤ë¡£
name ¤Ï¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î̾Á°¤Ç¤¢¤ë¡£
typeN ¤Ï N ÈÖÌܤΰú¤­¿ô¤Î·¿¤Ç¤¢¤ë¡£
argN ¤Ï N ÈÖÌܤΰú¤­¿ô¤Î̾Á°¤Ç¤¢¤ë¡£

¤³¤ì¤é¤Î¥Þ¥¯¥í¤Ï¡¢»ØÄꤷ¤¿°ú¤­¿ô¤ò»ý¤Ä name ¤È¤¤¤¦Ì¾Á°¤Î´Ø¿ô¤òÀ¸À®¤¹¤ë¡£ °ìÅÙ¥½¡¼¥¹¥Õ¥¡¥¤¥ëÃæ¤Ç¤³¤Î _syscall() ¥Þ¥¯¥í¤ò¸Æ¤ó¤Ç¤ª¤¯¤È¡¢ name ¤Ç¤³¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò¸Æ¤Ö¤³¤È¤¬¤Ç¤­¤ë¡£

¥Õ¥¡¥¤¥ë

/usr/include/linux/unistd.h

½àµò

¤³¤Î¥»¥¯¥·¥ç¥ó¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬½àµò¤¹¤ë Unix ¤Î¼ïÊ̤äɸ½àµ¬³Ê¤ò ɽ¤¹¤¿¤á¤Ë¡¢°Ê²¼¤Îά¹æ¤ò»ÈÍѤ¹¤ë¡£ standards(7) ¤ò»²¾È¡£

Ãí°Õ

_syscall() ¥Þ¥¯¥í¤Ï¥×¥í¥È¥¿¥¤¥×¤òÀ¸À®¤·¤Ê¤¤¡£¥æ¡¼¥¶¡¼¤Ï¼«Ê¬¤Ç ¥×¥í¥È¥¿¥¤¥×¤ò½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¡£
C++ ¥æ¡¼¥¶¡¼¤Î¾ì¹ç¤ÏÆä˽ÅÍפǤ¢¤ë¡£

¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÏÀµ¤Î¥¨¥é¡¼¥³¡¼¥É¤Î¤ß¤Þ¤¿¤ÏÉé¤Î¥¨¥é¡¼¥³¡¼¥É¤Î¤ß¤ò ÊÖ¤¹¤³¤È¤¬Äê¤á¤é¤ì¤Æ¤¤¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¡£ ¤½¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬¤É¤Î¤è¤¦¤Ê¥¨¥é¡¼¥³¡¼¥É¤òÊÖ¤¹¤«¤Ë¤Ä¤¤¤Æ³Îǧ¤¹¤ë ¤¿¤á¤Ë¤Ï¤½¤Î¥½¡¼¥¹¥³¡¼¥É¤òÆɤàɬÍפ¬¤¢¤ë¡£ ¤¿¤¤¤Æ¤¤¤Î¾ì¹ç¡¢É¸½à¤Î¥¨¥é¡¼¥³¡¼¥É¤ÎÉé¤ÎÃÍ (Î㤨¤Ð -EPERM ¤Î¤è¤¦¤Ê) ¤òÊÖ¤¹¡£ _syscall() ¥Þ¥¯¥í¤Ï¡¢¤½¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÎÊÖ¤êÃÍ r ¤¬Éé¤Ç¤Ê¤¤¾ì¹ç¡¢ ¤½¤ÎÃͤò¤½¤Î¤Þ¤ÞÊÖ¤¹¡£Éé¤Î¾ì¹ç¤Ë¤ÏÊÑ¿ô errno ¤Ë -r ¤òÀßÄꤷ¤Æ -1 ¤òÊÖ¤¹¡£ ³Æ¥¨¥é¡¼¥³¡¼¥É¤Ë´Ø¤·¤Æ¤Ï errno(3) ¤ò»²¾È¡£

(mmap(2) ¤Ê¤É¤Î) ¤¤¤¯¤Ä¤«¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï 5¸Ä¤è¤ê¿¤¯¤Î°ú¤­¿ô¤òÍ׵᤹¤ë¡£ ¤³¤¦¤¤¤Ã¤¿¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï¥¹¥¿¥Ã¥¯¤Ë°ú¤­¿ô¤ò¥×¥Ã¥·¥å¤·¡¢ ¤½¤Î°ú¤­¿ô¤Î¤«¤¿¤Þ¤ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÅϤ·¤Æ½èÍý¤µ¤ì¤ë¡£

¥·¥¹¥Æ¥à¥³¡¼¥ë¤òÄêµÁ¤¹¤ë¾ì¹ç¡¢¤½¤Î°ú¤­¿ô¤Î·¿¤ÏÃÍÅϤ· (by-value) ¤«¡¢ (¹½Â¤ÂΤΤ褦¤Ê½¸¹çŪ¤Ê¥Ç¡¼¥¿¤Î¾ì¹ç¤Ï) ¥Ý¥¤¥ó¥¿ÅϤ· (by-pointer) ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£

glibc ¤¬¤Þ¤ÀÃΤé¤Ê¤¤¥·¥¹¥Æ¥à¥³¡¼¥ë¤òµ¯Æ°¤¹¤ë¤Î¤Ë¹¥¤Þ¤·¤¤ÊýË¡¤Ï syscall(2) ¤ò»È¤¦¤³¤È¤Ç¤¢¤ë¡£¤·¤«¤·¤Ê¤¬¤é¡¢¤³¤Î»ÅÁȤߤòÍøÍѤǤ­¤ë¤Î¤Ï¡¢ syscall(2) ¤ËÂбþ¤·¤¿ libc (glibc ¤Ê¤É) ¤ò»È¤Ã¤Æ¤ª¤ê¡¢ ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë <sys/syscall.h> ¤ËɬÍ×¤Ê SYS_foo ¤ÎÄêµÁ¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤À¤±¤Ç¤¢¤ë¡£ ¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢_syscall ¥Þ¥¯¥í¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¡£

¤¤¤¯¤Ä¤«¤Î¥¢¡¼¥­¥Æ¥¯¥Á¥ã¡¢ÆÃ¤Ë ia64¡¢¤Ç¤Ï _syscall ¥Þ¥¯¥í¤Ï Ä󶡤µ¤ì¤Æ¤¤¤Ê¤¤¡£¤³¤Î¤è¤¦¤Ê¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Ç¤Ï syscall(2) ¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£

Îã


#include <stdio.h>

#include <errno.h>

#include <linux/unistd.h>       /* for _syscallX macros/related stuff */

#include <linux/kernel.h>       /* for struct sysinfo */



_syscall1(int, sysinfo, struct sysinfo *, info);



/* Ãí°Õ¡§ nroff ¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤«¤éľÀÜ¥³¥Ô¡¼¤¹¤ë¤È¤­¤Ï

printf ʸ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë;ʬ¤Ê¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤ò½üµî¤¹¤ë

¤³¤È¤ò˺¤ì¤Ê¤¤¤è¤¦¤Ë */



int

main(void)

{

    struct sysinfo s_info;

    int error;



    error = sysinfo(&s_info);

    printf("code error = %d\n", error);

    printf("Uptime = %lds\nLoad: 1 min %lu / 5 min %lu / 15 min %lu\n"

           "RAM: total %lu / free %lu / shared %lu\n"

           "Memory in buffers = %lu\nSwap: total %lu / free %lu\n"

           "Number of processes = %d\n",

           s_info.uptime, s_info.loads[0],

           s_info.loads[1], s_info.loads[2],

           s_info.totalram, s_info.freeram,

           s_info.sharedram, s_info.bufferram,

           s_info.totalswap, s_info.freeswap,

           s_info.procs);

    exit(EXIT_SUCCESS);

}

½ÐÎÏÎã


code error = 0

uptime = 502034s

Load: 1 min 13376 / 5 min 5504 / 15 min 1152

RAM: total 15343616 / free 827392 / shared 8237056

Memory in buffers = 5066752

Swap: total 27881472 / free 24698880

Number of processes = 40

´ØÏ¢¹àÌÜ

syscall(2), errno(3), feature_test_macros(7)