'컴퓨터 과학!/Operating System'에 해당되는 글 8건

  1. 2006/04/12 힘들어요. (7)
  2. 2005/10/12 NesC
  3. 2005/10/11 tinyOS를 깔자. (5)
  4. 2005/06/03 open system call 로, inode 접근 방법을 알아보자ㅡ!! (미완. -_-;; ) (6)
  5. 2005/03/30 hdparm을 써보자. (4)
  6. 2005/03/26 리눅스 커널 소스 깔기 + 컴파일
  7. 2005/03/09 ACPI
  8. 2004/09/17 시스템 프로그래밍 HW#1 (5)

힘들어요.

컴퓨터 과학!/Operating System 2006/04/12 00:13
어제 오늘, 클러스터 노드들 세팅을 했는데...
힘들어요...ㅜ.ㅜ

할일은 자꾸 쌓여만 가고... 우어어ㅡ
Trackback 0 : Comments 7

NesC

컴퓨터 과학!/Operating System 2005/10/12 14:47
http://nescc.sourceforge.net/
http://www.tinyos.net/tinyos-1.x/doc/tutorial/
Trackback 0 : Comment 0

tinyOS를 깔자.

컴퓨터 과학!/Operating System 2005/10/11 13:53
1. tinyos-1.1.11-3is.exe 설치.
2. 패치
tinyos-1.1.12Apr2005cvs-1.cygwin.noarch.rpm
tinyos-1.1.13May2005cvs-1.cygwin.noarch.rpm
끝.

소스 코드를 찾아보자.
(헤매다가, 준상 슨배가 찾아줬다ㅡ 하하하; )
opt\tinyos-1.x\tos\platform\micaz 에 있다.

nesC를 잘 분석해보자. 하하하
Trackback 1 : Comments 5

open system call 로, inode 접근 방법을 알아보자ㅡ!! (미완. -_-;; )

컴퓨터 과학!/Operating System 2005/06/03 20:38
파일 이름을 인자로 sys_open()이 호출 되면 파일 시스템은 요청된 파일에 대한 inode를 찾는다.

1. sys_open()
http://lxr.linux.no/source/fs/open.c?v=2.4.28#L798
798 asmlinkage long sys_open(const char * filename, int flags, int mode)
799 {
800 char * tmp;
801 int fd, error;

808 if (!IS_ERR(tmp)) {
809 fd = get_unused_fd();
810 if (fd >= 0) {
811 struct file *f = filp_open(tmp, flags, mode);
812 error = PTR_ERR(f);
813 if (IS_ERR(f))
814 goto out_error;
815 fd_install(fd, f);
816 }

826 }

2. filp_open() : open_namei()가 찾아준 inode를 찾아주면, struct file을 위한 메모리 공간을 할당하고 이 구조의 초기화를 수행한다.
http://lxr.linux.no/source/fs/open.c?v=2.4.28#L656
656 struct file *filp_open(const char * filename, int flags, int mode)
657 {
658 int namei_flags, error;
659 struct nameidata nd;
660

667 error = open_namei(filename, namei_flags, mode, &nd);668 if (!error)
669 return dentry_open(nd.dentry, nd.mnt, flags);
//오잉? nd는 선언만 하고, inode 찾아오라고 open_namei()에 보내는데,
//open_namei()1018번째 줄은 뭐하는 짓이란 말인가!

672 }

(*)nameidata의 자료구조는 다음과 같다.
http://lxr.linux.no/source/include/linux/fs.h?v=2.4.28#L697
697 struct nameidata {
698 struct dentry *dentry;
699 struct vfsmount *mnt;
700 struct qstr last;
701 unsigned int flags;
702 int last_type;
703 };


3. open_namei() : 인자로 전달된 파일 이름과 디렉토리 구조를 이용해 그 파일에 대응되는 inode를 파일 시스템에서 찾아 리턴한다.
http://lxr.linux.no/source/fs/namei.c?v=2.4.28#L1001
1001 int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
1002 {
1003 int acc_mode, error = 0;
1004 struct inode *inode;
1005 struct dentry *dentry;
1006 struct dentry *dir;
1007 int count = 0;
1008
1009 acc_mode = ACC_MODE(flag);
1010
1011 /*
1012 * The simplest case - just a plain lookup.
1013 */
1014 if (!(flag & O_CREAT)) {
1015 error = path_lookup(pathname, lookup_flags(flag), nd); //옹.. 여기서 dentry 찾아 넣어주나? ( '')
1016 if (error)
1017 return error;
1018 dentry = nd->dentry; // 문제의 1018
1019 goto ok;
1020 }
1021
1022 /*
1023 * Create - we need to know the parent.
1024 */
1025 error = path_lookup(pathname, LOOKUP_PARENT, nd);
1026 if (error)
1027 return error;

4. path_lookup() : path를 찾아주나 보다.
http://lxr.linux.no/source/fs/namei.c?v=2.4.28#L744
744 int fastcall path_lookup(const char *path, unsigned flags, struct nameidata *nd)
745 {
746 int error = 0;
747 if (path_init(path, flags, nd))
748 error = path_walk(path, nd);
749 return error;
750 }

우어어ㅡ 이렇게 막 따라가다 보므는... 끝이 음따.. 리눅스... OTL

5. path_init() : path를 초기화 해주나 보지... (의욕 상실 중.)
http://lxr.linux.no/source/fs/namei.c?v=2.4.28#L754
754 int fastcall path_init(const char *name, unsigned int flags, struct nameidata *nd)
755 {
756 nd->last_type = LAST_ROOT; /* if there are only slashes... */
757 nd->flags = flags;
758 if (*name=='/')
759 return walk_init_root(name,nd); // 따라갔더니 특별한 것 없음.
760 read_lock(¤t->fs->lock);
761 nd->mnt = mntget(current->fs->pwdmnt);
762 nd->dentry = dget(current->fs->pwd); // 이야ㅡ 드디어 덴트리 받아오는 진짜 함수를 발견! -ㅇ- 알고보니 pwd -ㅇ-;;;;
763 read_unlock(¤t->fs->lock);
764 return 1;
765 }

6. path_walk() : link_path_walk()를 부른다.
http://lxr.linux.no/source/fs/namei.c?v=2.4.28#L656

7. link_path_walk() : 오오ㅡ 뭔가 내가 찾던 바로 그 함수인 듯 -ㅇ- (기대기대~)
http://lxr.linux.no/source/fs/namei.c?v=2.4.28#L450
450 int fastcall link_path_walk(const char * name, struct nameidata *nd)
451 {
452 struct dentry *dentry;
453 struct inode *inode;
454 int err;
455 unsigned int lookup_flags = nd->flags;
456
457 while (*name=='/')
458 name++;
459 if (!*name)
460 goto return_reval;
461
462 inode = nd->dentry->d_inode;
// 허걱!! dget() 함수에소 inode를 가져온건가ㅡ 왜 이까지 왔지 -ㅇ-

8. dget()
244 static __inline__ struct dentry * dget(struct dentry *dentry)
245 {
246 if (dentry) {
247 if (!atomic_read(&dentry->d_count))
248 out_of_line_bug();
249 atomic_inc(&dentry->d_count);
250 }
251 return dentry;
252 }

모르겠다. 잠온다. -.-
Trackback 0 : Comments 6

hdparm을 써보자.

컴퓨터 과학!/Operating System 2005/03/30 15:55
하드 디스크를 컨트롤하는 아주 쉬운 방법 중에 하나이다.

온라인 상에서 hdparm을 다운 받아서 그냥 깔아만 주면 된다.

http://www.ibiblio.org/pub/Linux/system/hardware/

요기에서, hdparm 최신 버젼을 받는다.

나는 hdparm-5.9.tar.gz을 다운 받았다.

]# tar xzf hdparm-5.9.tar.gz
으로 압축을 풀어서, hdparm-5.9 폴더에 들어가보자.
뭔가가 많다. (사실 이정도는 많은 편은 아니지만)

그리고 그냥 실행하면 된다..;;

]# hdparm -M /dev/hda : 라고 하면, 이 하드가 acoustic setting을 지원하는 지 알 수 있다. 이건 잘 모르겠지만, 하드 스핀 속도를 조절하는 것 같은데, 128~256 값이 있고, 128이 가장 느리고 조용한 상태이고, 256은 가장 빠르지만 시끄러운 상태이다.
내 도시바 R100에서는 작동하지 않는다.

그리고 많이 사용하는 것은,
]# hdparm -y /dev/hda : 이건, standby 상태로, 하드 스핀 속도를 낮추어 놓고 있다가, 어떤 작업이 들어오면 다시 하드가 열심히 돌아간다.
실제로 이걸 써 보면, 하드가 퓽~ 꺼졌다가, 일을 시키면 다시 "이융~~" 하고 돌아가는 것을 들을 수 있다. (조용한 곳에서.)

]# hdparm -Y /dev/hda : 이것은, sleep 상태로, 하드를 잠재운다.. ( '') 그래서 이건 일을 시켜도 안되고, 가서 깨워야 하는데, (hard reset) 내가 못찾은건지는 모르겠는데.... hdparm 에는 하드 리셋 옵션을 찾을 수 없었다. 다행히, 리눅스에서 ACPI를 지원하므로,
내가 일을 시키면 ACPI가 열심히 애를 깨운다. 엄청 늦게 일어난다. (요 ioctl 을 찾아봐야겠다.)

]# hdparm -S 1 /dev/hda : 이것은, 아무 일 없이 1(5초)간 있으면, (idle 상태) 하드를 standby 상태로 만들라는 것. 5초로 설정해 놓으면, 정말, 얘가 계속 혼자 핑~ 이융~ 핑~ 이융~ 하는 것을 들을 수 있다. -_-;;; (오ㅡ 내 베터리~~~ )

]# hdparm -C /dev/hda : 요거는 지금 하드의 상태를 알아보는 것인데.... 이거 실행 시키면 스탠바이 하던 하드도 일어나고, 자고 있던 하드도 일어난다;;;

]# hdparm -w /dev/hda : 요거는 하드 리셋 시키는 건데...
옵션 설명에 (dangerous)라고 적혀있다. 근데 해봤다. 내 노트북에서는 ACPI가 자는 하드를 깨우지만, 그렇지 않다면 시스템을 리붓시킬 수 밖에 없기 때문에, reset 시키는 ioctl 을 call 하는 거 같길래..
함 해봤더니... ( '') 시스템이 뻗었다. 하하하하
(세그멘테이션 오류가 났다. 잘못된 메모리를 참조한 거란다.)

소스 코드가 보고 싶다면, hdparm.c 파일을 보고 열심히 잘 trace 해보면 된다.

hdparm.c
main(int argc, char **argv)
{
...
case 'y';
get_standbynow = noisy;
noisy = 1;
set_standbynow = 1;
break;
case 'Y';
get_sleepnow = noisy;
noisy = 1;
set_sleepnow = 1;
break;
...
process_dev(*p); // *p is device name such as /dev/hda
}

void process_dev (char *devname)
{
int fd=open(devname, open_flag);
...

if (set_sleepnow) {
unsigned char args1[4] = {WIN_SLEEPNOW1,0,0,0}; //#define WIN_SLEEPNOW1 0xE6
unsigned char args2[4] = {WIN_SLEEPNOW2,0,0,0}; //#define WIN_SLEEPNOW2 0x99
if (get_sleepnow)
printf(" issuing sleep command\n");
if (ioctl(fd, HDIO_DRIVE_CMD, &args1)
&& ioctl(fd, HDIO_DRIVE_CMD, &args2))
perror(" HDIO_DRIVE_CMD(sleep) failed");
}

if (set_standby) {
unsigned char args[4] = {WIN_SETIDLE1,standby_requested,0,0};
if (get_standby) {
printf(" setting standby to %lu", standby_requested);
interpret_standby(standby_requested);
}
if (ioctl(fd, HDIO_DRIVE_CMD, &args))
perror(" HDIO_DRIVE_CMD(setidle1) failed");
}
...
}

자ㅡ 그러면 저 ioctl()은 어디에 있는가?
헤더는, "/usr/include/sys/ioctl.h" 에 있다.

그리고, 이... 하드의 드라이버를 찾아가보자ㅡ
/usr/src/linux-2.6.9/drivers/ide/
1. Find "HDIO_DRIVE_CMD" : ide.c
int generic_ide_ioctl(struct file *file, struct block_device *bdev, unsigned int cmd, unsigned long arg)
{…
switch (cmd) {
...
case HDIO_DRIVE_CMD:
if (!capable(CAP_SYS_RAWIO))
return -EACCES;
return ide_cmd_ioctl(drive, cmd, arg);
...
}
}
EXPORT_SYMBOL(generic_ide_ioctl); // 요건 밖에서도 이 함수 사용할 수 있도록 끄집어 내 놓은것.

#### 아~ 여기서 부터는 trace를 하긴 했는데, 잘 모르겠네. 호호호호~~ =33
ide-taskfile.c
1. ide_cmd_ioctl( )
2. ide_wait_cmd( )

ide-io.c
ide_do_drive_cmd( )
{
blk_put_request(rq); // driver/block/ll_rw-blk.c
}
Trackback 0 : Comments 4

리눅스 커널 소스 깔기 + 컴파일

컴퓨터 과학!/Operating System 2005/03/26 23:37
우선은...
윈도우즈에서, 아무 생각 없이 파티션을 날렸는데,
GRUB를 날리지 않았을 때...
윈도우로 부팅하는 방법.
grub> rootnoverify (hd0,0)
grub> makeactive grub
grub> chainloader +1
grub> boot

grub는 이래저래 장점이 많으나,
덩치도 크고, 플로피와 씨디롬 부팅이 안된다!!는 것을 유념해야한다.

그리고.
분명! FedoraCore3 설치시에는 "커널개발"이 없다! T.T
그래서 나는 다시 커널 소스를 다운 받아서 깔아줘야했다.
사실, 익숙한 사람들에겐 정말 별 것 아닌 일이지만.

난 분명 저번주에 깔았음에도 까먹은 것으로 보아, 적어놔야겠다. -_-;;

1. 소스를 다운 받는다;
2. rpm -ivh kernel-2.6.9-1.677.src.rpm
-> /usr/src/redhot/SOURCE 에 깔린다.
3. /usr/src/redhot/SOURCE 에 가서. 타볼소스를 풀어준다.
bunzip2 linux-2.6.9.tar.gz2
tar xvf linux-2.6.9.tar -C /usr/src

끝! 간단하고나..

==========================================================
자. 이제 컴파일을 해보자! -ㅇ-

우선 그 전에 해줘야 할 것이 있다.
버젼이 디리리리 바뀌어도 일관성 있게 편리하게 사용할 수 있도록,
"linux" 라는 심볼릭 링크를 걸어주자!

/usr/src/에서 ]$ ln -sf linux-2.4.22 linux
이렇게 하면, linux-2.4.22폴더를 linux 라고 지칭할 수 있다. 확인!
/usr/src/에서 ]$ ls -al
"~~~~ linux -> linux2.4.22 " 을 볼 수 있을 것이다.
그리고 심볼릭 링크를 하나 더 걸어줘야 하는데, 바로 asm 이다.
/usr/src/linux에서 ]$ ln -sf asm-i386 asm

자. 그러면, 컴파일 해 볼까요?
/usr/src/linux 폴더 아래에서 해야한다.
1. ]$ make mrprop : 이전의 config 무시하고 다시 설정할 때. 기존의 config 에서 몇 개 추가해주는 거 정도에선 안해도 된다.

2. ]$ make menuconfig : 여기에서 이제 뺄 것 빼고 더할 것 더하면 된다. <*> 표시는 커널에 넣을 것, 표시는 모듈로 만들 것, < >는 선택 안함.

2-1. 다른 .config 파일을 불러서 할 수도 있고, 다른 .config 파일을 linux 폴더 안에 쓱~ 넣어 놓고, ]$make oldconfig 하면서 선택 삭제 해 주어도 된다. 주로, [N/y/?] 라고 물어보는데, 대문자가 디폴트. ?는 설명.

3. ]$ make dep : 이제 설정해 주었으니, 디펜던시를 잡아준다.

4. ]$ make clean :

5. ]$ make bzImage :

6. ]$ make install

7. ]$ make modules :

8. ]$ make modules_install :
Trackback 0 : Comment 0

ACPI

컴퓨터 과학!/Operating System 2005/03/09 22:22
ACPI [Advanced Configuration and Power Interface]

1996년에 인텔(Intel)과 마이크로소프트(Microsoft), 일본의 도시바(東芝)가 공동으로 작업하여 책정한 컴퓨터의 전원 관리 규격.

요약
1996년에 인텔(Intel)과 마이크로소프트(Microsoft), 일본의 도시바(東芝)가 공동으로 작업하여 책정한 컴퓨터의 전원 관리 규격.

오퍼레이팅 시스템에 의해 프로세스는 물론, 컴퓨터에 접속한 각종의 주변 회로, 기기류의 전원 상태 등을 세밀하게 조정할 수 있다.

기존에는 하드웨어에 가까운 부분에서 APM이라는 규격이 절전 기능을 실행하고 있었지만, 앞으로는 ACPI 규격에 의한 제어로 차츰 바뀔 것으로 기대된다. 데스크탑 컴퓨터에서도 이 규격을 사용함으로써, 노트형퍼스컴(노트북)과 같은 서스팬드(suspend:작업 실시 중에 일시적으로 정지하는 것)와 그 복귀에 의해 더욱 빠르게 기동할 수 있다.

서스팬드 중에는 냉각팬의 소음을 포함해 컴퓨터는 어떤 소음도 내지 않기 때문에 가정용 컴퓨터에서도 환영받을 것으로 전망된다. 물론 서스팬드 중이라도 팩스 모뎀에 착신 신호가 들어오면 바로 응답하여 대응한다.

단지 ACPI를 처음으로 적용한 운영 체제는 윈도98이고, 제품의 대응 상황에 관해서는 아직은 안정적이지 않다. 현재의 상태에서는 노트북의 절전 기능에 있어서는 APM을 사용하는 편이 효율이 있다는 사례도 있고, 업계 표준으로 자리잡기까지는 아직 시간이 걸릴 것으로 보인다.
Trackback 0 : Comment 0

시스템 프로그래밍 HW#1

컴퓨터 과학!/Operating System 2004/09/17 22:13
과제설명
top은 프로세스의 CPU사용량을 보여주는 유틸리티 이다. 일반적으로 배포본에 같이 포함되지만 unix top project를 통해 다양한 환경에서 이식될 수 있도록 소스가 제공된다. 배포되는 top 소스는 다양한 환경을 자동으로 인식하고 각기 적절하게 컴파일할 수 있도록 해주기 위해 configure 라는 쉘스크립트 파일을 제공하고 있다. 따라서 top을 설치하기 위해서는 configure라는 파일을 실행시켜준 다음 make 명령으로 컴파일을 하도록 되어 있다. 보다 자세히 말하면 configure를 실행시키면 해당 시스템을 여러가지 테스트를 통해 자동으로 인식하고, 각기 적절하게 컴파일할 수 있는 Makefile을 작성한다.
이후 사용자는 make 명령을 내려주면 해당 시스템에 맞게끔 컴파일이 되게 된다. 이번 과제는 여기서 사용되는 쉘스크립트로 작성되 있는 configure 파일의 코드를 분석하고, 이 파일이 실행된 후 작성되는 Makefile의 코드를 분석함으로써 쉘스크립트와 Makefile에 대한 이해를 증진시키고, 나아가 실제 프로그램 작성시 쉘스크립트와 Makefile작성에 익숙하게끔 하려는 것이다.

쉘 스크립트에 익숙해 진후 쉡 스크립트를 이용하여 실제 어플리케이션을 작성하도록 한다. 작성할 어플리케이션은 system admin을 위한 사용자 계정 작성 프로그램이다. 리눅스에는 adduser라는 shell기반의 사용자 등록 프로그램이 있지만 많은 옵션때문에 사용하기 어렵다. gui기반의 사용자 관리툴도 존재 하지만 x-windows가 없는 상황에서 빠르고 편리하게 사용자를 등록 할 수 있는 사용자 계정 작성 프로그램을 만들어 보도록 하겠다. top의 configure 파일을 참고하여 인터렉티브한 사용자 계정 작성 프로그램을 만들도록 한다.


Top 소스 설치 과정
  • 사용자를 root로 하고,

  • top 3.5 소스를 다운받는다.

  • top 3.5 는 (http://www.unixtop.org)에서
    다운받을 수 있다.

  • 원하는 디렉토리로 top-3.5.tar.gz을 복사한 후
      tar
    xvfz top-3.5.tar
    .gz

    로 명령하여 top 소스를 푼다.

  • 이렇게 하면 원하는 디렉토리에 top-3.5라는 디렉토리가 생기고 그 안에 소스 압축이
    풀린다.

  • 그러면 top-3.5 디렉토리로 가서
      ./Configure
    라고 명령한다.(반드시 리눅스에서 실행시킨다.)

  • 물어보는 질문에 개인의 시스템에 맞추어 적절히 대답한다.

  • 실행이 종료된 후 해당 디렉토리에 Makefile이 작성되었는지 확인한다.

  • 아래와 같이 명령하여
       make
     install

    정상적인 설치가 되는지 확인해 본다.



Makefile 및 Configure 코드 분석자료 작성방법

  • Makefile 및 Configure코드분석은 보고서에 들어갈 내용만 작성한다.

  • 보고서에 "Makefile 코드분석" 이라는 항목에 아래의 5개의 컴파일 명령에 대해 번호를 붙여 작성토록 한다.
    • make를 사용하여 컴파일할 경우 다양한 옵션을 줄 수 있다. 본 과제에서는 이 중 다음의 5개 컴파일 명령에 대해
      각 명령의 의미와 이 명령에 의해 컴파일되는 과정을 Makefile의 수행코드를 순서대로 나열하고 상세히 설명한다.

      (변수선언은 순서에 포함시키지 않아도 된다. 단, 옵션에 변수가
      포함되 있을시 어디에서 어떤 식으로 변수값이 지정되는지 포함시키도록 한다.)
      1. make install
      2. make prefix=/usr/local/share install
      3. make uninstall
      4. make realclean
      5. make test

    • 실행되는 코드 나열시 설명과 함께 몇 번째 줄인지 명시한다.

      • 예를들어 if부터 fi까지, case부터 esac까지등 구문의 의미를 중심으로 주석을 위의 예시
        단, if부터 fi까지의 내부에 또 다시 if, case등의 구문이 있을 경우
        각각의 의미에 대해서도 기술한다.
        또한, 명령어가 독립적으로 사용되었을 경우나 중요한 명령이라 생각되는 부분에
        대해서는 이에 대한 의미를 기술한다.
        아래와 같이 리다이렉션되어 다른 파일에 저장되는 부분의 코드에 대해서는
        주석을 달지 않아도 된다.
        첨부문서에서 코드의 주석부분은 알아보기 쉽게 색을 달리하거나,
        폰트와 굵기등을 달리하여 출력한다.
        한 라인, 라인마다 주석을 달 경우 추가점수가 부여된다.


  • 보고서에 "Configure 코드분석"이라는 항목에는 다음 2가지 내용을 기술한다.
    • Interactive 메뉴의 Control flow


    • 전체코드와 주석 (Makefile 예시 참조)



사용자 계정 관리 프로그램 작성

1. 배경지식
passwd와 관련된 정보는
/etc/passwd
/etc/group
등에 저장되어 있다.
/etc/passwd에는 기본적인 사용자 계정 관련 정보가 들어 있고,
/etc/group에는 그룹 정보가 들어 있다.

useradd, groupadd 유틸리티를 사용하면 사용자 및 group를 등록 할 수 있다.

2. 설명
사용자 계정 정보는 "사용자명(ID)", "사용자ID(UID)", "사용자 그룹(GID)", "정보(Comment)",
"로그인 쉘(shell)", "홈 디렉토리(home directory)" 로 구성되어 있다.
사용자 등록시 useradd(혹은 adduser)를 사용하게 되면 이러한 정보들을 옵션을 이용하여
등록하도록 되어 있다. shell프로그래밍을 이용하여 간편하게 사용자 정보를 작성하고 관리
할 수 있는 프로그램을 작성한다.

이때 인터렉티브한 입력은 shell을 통해서 받을 수 있도록 하고, 실제 등록은 shell 스크립트에서
useradd와 groupadd를 직접 호출하여 등록 할 수 있도록 한다.


3. 상세 프로그램
프로그램은 각각 메뉴와 sub메뉴로 구성되어 있다. 초기 프로그램을 실행하면 다음과 같은
메뉴가 나온다.

각각의 메뉴는 다음과 같은 역할을 한다.

1. Show All Group : 모든 유저 정보를 보여준다.
2. Create New Group : 새로운 그룹을 생성한다.
3. Show All User : 모든 유저 정보를 보여준다.
4. Create New User : 새로운 유저를 생성한다.

1을 선택할 경우 다음과 같이 그룹 정보를 보여준다


2를 선택할 경우 다음과 같은 순서로 그룹을 등록 할 수 있도록 한다.
Group ID : 사용자가 직접 입력도 가능하고, 입력없이 엔터치면 자동적으로 할당하여 준다.
Group Name : 사용자가 직접 입력하도록 한다. 중복을 검사하여 중복 입력일 경우 에러 메시지 출력후 다시 입력 받는다.


3을 선택할 경우 다음과 같이 그룹 정보를 보여준다.

4를 선택할 경우 다음과 같은 순서로 유저를 등록 할 수 있도록 한다.

User ID : 사용자명, 사용자가 직접 입력한다. 중복을 검사하여 중복된 입력일 경우 에러 메시지 출력 후 다시 입력 받는다.
UID : UID, 사용자가 직접 입력 가능하며, 엔터치면 자동적으로 할당한다.
Select Group : 현재 입력 가능한 그룹명을 모두 출력하여 선택 할 수 있도록 한다.
Comment : 학번과 이름을 입력 받을 수 있도록 한다. (분리하여 입력 가능)
Shell : /bin/csh, /bin/tcsh, /bin/sh 중에 하나 선택 가능하도록 한다.
Home directory : 엔터칠 경우 자동적으로 만들어 지도록 한다.

보다 구체적인 내용은 레드햇 배포판의 "Red Hat 사용자 관리" 유틸리티 참조.

4. 힌트

Configure에 쓰인 인터렉티브 프로그래밍 방법 참조
useradd, groupadd 명령어 참조
"Red Hat 사용자 관리" 유틸리티등 계정관리 유틸리티 참조


과제 제출 형식
  1. 보고서 제출 형식

    • Makefile 및 Configure code 분석
      • 시스템 환경

      • 기본지식 (Makefile및 Configure에 쓰인 주요 명령어 및 문법사항 기술)

      • Makefile code분석

      • Configure화일 분석(인터렉티브 관점)

    • 계정관리 시스템 구현
      • 테스트 환경

      • 기본 지식

      • 프로그램에 쓰인 주요 알고리즘

      • 프로그램에 쓰인 주요 함수

      • 프로그램 실행 방법 및 실행 결과

  2. 프로그램 제출 형식

    • 실행 파일명을 자신의 학번으로 하여 제출한다.
      ex) 학번이 2020100인 학생 -> 2020100.sh





참고 사이트 및 자료


  • Unix Shells by Example (Paperback) 저자:Ellie Quigley,
    출판사:Prentice - Hall

  • useradd, groupadd man page
Trackback 0 : Comments 5