#include <stdlib.h> int system (const char * string);
string °ªÀÌ NULLÀ̶ó¸é, system() Àº shellÀ» ÀÌ¿ëÇÒ¼ö ÀÖ´Ù¸é 0 ÀÌ ¾Æ´Ñ °ªÀ», ±×·¸Áö ¾ÊÀ¸¸é 0 °ªÀ» ¹ÝȯÇÑ´Ù.
system() Àº ¾î¶² ´Ù¸¥ ÀÚ½ÄÀÇ wait »óÅ¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù.
libc ¹öÀüÀÇ
system()
ÀÌ ÀÎÅÍ·´Æ®¸¦ ¹«½ÃÇÑ´Ù´Â °ÍÀº ¸Å¿ì ºÒÇàÇÑ ÀÏÀÌ´Ù.
ÀÌ°ÍÀº ÇÔ¼ö ÈÄÃâ½Ã ·çÇÁ¿¡¼ ÀÎÅÍ·´Æ®ÇÒ¼ö ¾ø°Ô µÇµµ·Ï ÇÁ·Î±×·¥À» ¸¸µç´Ù.
ÀÌ°ÍÀº ±×·± ¸ñÀûÀÇ ÇÁ·Î±×·¥Àº
system()
ÀÌ ¾Æ´Ñ °³ÀÎ ¹öÀüÀÇ ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.(°æ°í: Å×½ºÆ®µÈ Äڵ尡 ¾Æ´Ï´Ù!)
int my_system (const char *command) { int pid, status; if (command == 0) return 1; pid = fork(); if (pid == -1) return -1; if (pid == 0) { char *argv[4]; argv[0] = "sh"; argv[1] = "-c"; argv[2] = command; argv[3] = 0; execve("/bin/sh", argv, environ); exit(127); } do { if (waitpid(pid, &status, 0) == -1) { if (errno != EINTR) return -1; } else return status; } while(1); }
suid ³ª sgid ¿ì¼±±ÇÀÌ ÀÖ´Â ÇÁ·Î±×·¥¿¡¼´Â system() À» »ç¿ëÇÏÁö ¸¶¶ó. ¿Ö³ÄÇÏ¸é ¸î¸î ȯ°æ º¯¼öµéÀ» À§ÇÑ ÀÌ»óÇÑ °ªµéÀÌ ½Ã½ºÅÛÀ» ¿ÀÀÛµ¿½Ãų¼ö Àֱ⠶§¹®ÀÌ´Ù. ´ë½Å¿¡ exec(3) °è¿ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇضó. ±×·¯³ª execlp(3) ³ª execvp(3)Àº Á¦¿ÜÇضó. »ç½Ç system() ÇÔ¼ö´Â /bin/sh ÀÌ bash ¹öÀü 2ÀÎ ½Ã½ºÅÛ¿¡¼ suid ³ª sgid ¿ì¼±±ÇÀÌ ÀÖ´Â ÇÁ·Î±×·¥¿¡¼´Â Àß ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé bash 2´Â ½ÃÀ۽à ¿ì¼±±ÇÀ» ¾ø¾Ö±â ¶§¹®ÀÌ´Ù. (DebianÀº shó·³ ±¸µ¿½Ã ÀÌ°ÍÀ» ÇÏÁö ¾Ê´Â ¼öÁ¤µÈ bash¸¦ »ç¿ëÇÑ´Ù.)
/bin/sh ÀÇ À¯¿ë¼º °Ë»ç´Â ½ÇÁ¦ÀûÀ¸·Î´Â ÇàÇØÁöÁö ¾Ê´Â´Ù; Ç×»ó À¯È¿ÇÏ´Ù°í °¡Á¤ÇÑ´Ù. ISO C´Â °Ë»ç¸¦ ÁöÁ¤ÇÏÁö¸¸, POSIX.2´Â ¸®ÅÏ °ªÀº Ç×»ó 0 ÀÌ ¾Æ´Ñ °ªÀ̾î¾ß ÇÑ´Ù°í ÁöÁ¤ÇÑ´Ù. ¿Ö³ÄÇϸé shellÀÌ ¾ø´Â ½Ã½ºÅÛÀº ÇàÇØÁ®¼´Â ¾ÈµÇ±â ¶§¹®ÀÌ´Ù.
¹Ýȯ °ª 127Àº shell ¸í·É¾î¿¡¼ °¡´ÉÇÏ´Ù. ±×·¯¹Ç·Î ÀÌ ¹Ýȯ °ªÀº execve() °¡ ½ÇÆÐÇߴٴ°ÍÀ» È®½ÇÈ÷ °¡¸®Å°Áö ¾Ê´Â´Ù; È®½ÅÀ» À§ÇØ errno ¸¦ °Ë»çÇضó.