※ find 명령어 특정 파일/디렉토리 검색 후 특정작업과 연계가능 형식 : find [검색디렉토리] [검색단어] [옵션] [액션] ex1) 특정파일 찾기 ]#find /home -name install.log [액션] [액션] 1. -print 2. -exec ls -l {} \; /dev/null // 휴지통과 같은 역할 ex2) 비어있는 파일 검색 ]#find / -empty -exec ls -l {} \;
※ df 현재 사용 중인 파일시스템들의 디스크 사용량 확인하는 명령어 - $df [options] [파일명] [options] -a : 모든 파일 시스템을 보여준다. (용량이 0byte인 파일시스템을 포함한다) -h : 사용자가 읽기 쉬운 용량단위로 정보를 보여준다. -i : 남은 공간, 사용 공간, 사용 퍼센트 정보를 보여준다. -k : 1KB 단위로 정보를 보여준다. -t 파일시스템 : 지정한 파일시스템의 정보만 보여준다. 예) df -t ext3 -x 파일시스템 : 지정한 파일시스템만 제외하고, 모든 파일시스템의 정보를 보여준다. df는 Disk Free의 약어로서 현재 사용중인 파일시스템의 전체 용량, 사용한 용량, 사용 가능한 용량, 사용율, 마운트 정보 등을 보여준다.
df 명령은 /etc/fstab파일에서 파일시스템 정보를 참조하고, /etc/mtab에서 마운트된 정보를 참조한다.
기본 용량 단위는 KB이며, 주로 root가 사용하는 명령어이다. ]#df Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda2 5036316 1496644 3283840 32% / 1 2 3 4 5 6 1 필드는, 파일시스템 장치명(device name)이다. 2 필드는, 각 파일시스템에 할당된 용량이다. 3 필드는, 사용된 용량이다. 4 필드는, 사용 가능한 용량이다. 5 필드는, 사용율을 나타낸다. 즉 전체 할당된 용량에 대한 사용된 용량의 백분율을 나타낸다. 6 필드는, 파일시스템이 마운트된 마운트 포인트를 표시한다.
※ du 특정 디렉토리의 용량을 확인하는 명령어 - $ du [options] [파일명]/[디렉토리명] [options] -a : 현재 디렉토리 아래의 모든 파일과 디렉토리의 사용 정보를 보여준다. -B : 지정한 size를 블록 사이즈로 사용한다. -b : 바이트 크기로 보여준다. -c : 모든 파일의 디스크 사용정보를 보여주고 나서 합계를 보여준다. -D : 계산되는 파일이나 경로가 심볼릭링크 파일이면 그 원본의 값을 보여준다. -h : 사용자가 읽기 쉬운 용량단위로 정보를 보여준다. -H : 1024단위의 비율로 보여준다. -k : 킬로 바이트 크기로 보여준다. -s : 디렉토리내에 존재하는 모든 파일과 서브디렉토리들의 전체 용량을 표시한다. -x : 현재 파일시스템의 파일 사용량만을 보여준다. -x File : 지정한 파일과 일치하는 것은 제외한다.
df/du : 파티션과 디렉토리 용량확인 df : 파티션에 대한 정보 확인 특정사용자의 홈디렉토리 사용량을 확인 홍길동 ]# du -sh /home/홍길동 ]# du -sh ~홍길동
※hdparm - $ hdparm [options] [장치명] [options] -a : 파일시스템의 readahead에 대한 파라미터 값을 확인 및 설정 -A : 드라이브의 read-lookahead flag (0/1)를 설정. -b : BUS 상태 값 (0==off, 1==on, 2==tristate)을 확인 및 설정 -B : APM 값 (범위:1-255) 설정 -c : IDE 32-bit IO 설정에 대한 확인 및 설정 -C : IDE 장치의 파워모드 상태 점검 -d : using_dma 플래그 설정 및 확인 -f : 지정한 장치에 대한 버퍼캐쉬 동기화 그리고 빠져나감. -g : 드라이브 geometry 값을 표시 -i : 드라이브 identification 값 표시 -k : keep_settings_over_reset 플래그 값 (0/1)의 설정 및 확인 -K :
-L : 드라이브 doorlock 값 (0/1) 설정 -m : multiple sector count 값 확인 및 점검 -n : ignore-write-errors 값 (0/1) 설정 및 확인 -P : 드라이브 prefetch cont 값 설정 -u : unmaskirq 플래그 값 (0/1) 설정 및 확인 -y : IDE 드라이브를 준비 상태로 둠. -Y : IDE 드라이브를 휴지 (sleep) 상태로 둠. -z : 파티션테이블 정보를 다시 읽어 들임. -Z : Seagate 장치에 대한 auto-powersaving 모드를 비활성화 함 -t : 디스크 드라이브의 읽는 속도를 체함 -T : 디스크 드라이브에 대한 캐쉬데이터 읽는 속도를 체크함. * Readahead 는 하드디스크에 접근할 때 미리 읽는 섹터개수를 알려준다. hdparm은 SATA와 ATA 장치들의 파라미터를 설정하고 확인하는 매우 유용한 명령어이다. 시스템에 장착된 하드디스크의 설정을 확인하거나 하드디스크의 설정을 하고자 할 때에 사용하는 명령어이다 실무에서는 주로 IDE/SCSI 하드디스크의 Access 속도를 측정 할때에 많이 사용한다. hdparm 1. multcount = 16 (on) // 블록의 수 2. IO_support = 0 (default 16-bit) // 동작 모드 설정 3. unmaskirq = 0 (off) // IRQ 사용 4. using_dma = 1 (on) // dma 사용 여부 5. keepsettings = 0 (off) // 소프트웨어로도 리셋 가능 6. readonly = 0 (off) 7. readahead = 256 (on) // 256섹터를 미리 읽겠다. 8. geometry = 16383/255/63, sectors = 514017, start = 0 ]#hdparm -y /dev/hda (사용) ]#hdparm -Y /dev/hda (휴지상태)
※ Badblocks 하드디스크의 Bad Block를 검사하는 명령어 - $ badblocks [options] [장치명] [블록개수] [options] -b 블록크기 : 블록크기 지정 (단 bytes 단위). 기본값은 1024bytes -c 블록수 : 한번에 테스트할 블록 개수. 기본값은 64블록. ]# badblocks -s -c 1024 /dev/sda1
-e 최대블록개수 : 점검을 멈출 최대 베드블록개수. 0이면 지정된 범위까지 점검을 한다. -s : 진행과정을 보여준다. 즉, 체크되는 블록번호를 보여줌. -n : 안전한 read/write 모드로 점검함. 즉, mount 되어 있는 경우에는 점검하지 않음. -w : write 모드 점검을 함. -n 옵션과 함께 사용 못함. -o 파일명 : 지정한 파일명에 점검된 베드블록 리스트를 을 기록함
]# badblocks -s -o bad.txt /dev/sda1 -i 파일명 : 미리 알려진 베드블록리스트를 지정한 파일 점검에서 제외함. 만약, 파일명이 "-"으로 지정되면 키보드로 입력 받음. BadBlocks 명령어는 하드디스크 같은 디스크의 베드블록을 검사하는 명령어이다. 시스템 관리자에게 가장 중요한 것은 하드디스크의 물리적인 문제로 인한 시스템 다운과 데이터 유실이라고 할 수 있다. 이런 경우를 대비해 주기적인 백업을 하기도 하고, RAID로 구성도 하고 디스크 동기화 작업도 한다. 하지만 베드블록이 존재하고 여기에 데이터를 access 하게 되면 시스템 장애가 발생되기에 주기적인 베드블록 점검 작업이 반드시 필요한 것이다.
parted 대용량 파티션 설정 및 관리 유틸리티 명령어 - $ parted [장치명] parted는 대용량 디스크장치에 대한 파티션을 설정하고 삭제 하는 하티션 관리도구이다. 이 명령어는 fdisk와 같이 파티션 작업도 가능하며, 파일시스템도 만들 수 있다. 그리고 특정 파티션에 있는 데이터를 다른 파티션으로 옮길 수도 있다. 1. 레이블 타입에 gpt 라는 것이 있다. 리눅스에서는 모든 디스크는 몇 개의 파티션으로 나뉘어져 있고 이들 파티션은 모두 레이블을 가지고 있다. 그리고 이런 리눅스의 모든 파티션들은 msdos 레이블만 사용한다. 즉, 리눅스의 부트로더인 LILO와 GRUB은 msdos 디스크 레이블만을 인식 가능하므로 그 외의 디스크레이블은 인식하지 못한다. 그런데 2TB 이상 되는 디스크는 gpt라는 레이블을 사용해야 한다. 하지만 gpt 레이블은 LILO와 GRUB에서 인식되지 못하므로 시스템디스크와 같은 부팅관련 디스크는 gpt 레이블을 사용해서는 안 된다. 2. kernel의 대용량 디스크 인식 문제 kernel이 2TB 이상의 파티션을 인식 가능하도록 즉, 사용 가능하도록 설정되어 있어야 한다. 현재의 kernel은 2TB를 인식하도록 되어 있기 때문에 특별한 문제는 없다. Parted의 작업 대상이 되는 장치들은 일반적으로 사용하는 리눅스 디스크 장치명이면 가능하며 RAID로 구성한 디스크 장치명과 Software RAID 장치명도 가능하다. 또한 LVM 논리장치명 또한 작업이 가능하다. 대부분의 작업이 2TB이상 되는 대용량이지만 2TB이하의 작업도 가능하다. [parted 활용법] 1. check partition : 파일시스템에 대한 간단한 확인 작업을 수행한다. 2. cp from to : 파일 시스템을 한 파티션에서 다른 파티션으로 복사한다. 3. help : 사용 가능한 명령어 목록을 보여준다. 4. mklabel label : 파티션 테이블에 대한 디스크 레이블을 생성한다. 5. mkfs partition file-system-type : file-system-type 유형의 파일 시스템을 생성한다. 6. mkpart part-type [fs-type] start end : 새로운 파일 시스템을 생성하지 않고 파티션을 만든다. 7. mkpartfs part-type fs-type start-mb end-mb : 파티션을 만들고 특정 파일 시스템을 생성한다. ex)(parted) mkpartfs primary ext3 101 220 8. move partition start-mb end-mb : 파티션을 이동한다. 9. print : 파티션 테이블을 보여준다. 10. quit : parted를 종료한다. 11. resize partition start-mb end-mb : 파티션의 크기를 start-mb에서 end-mb로 재조정한다. 12. rm partition : 파티션을 삭제 한다. 13. select device : 설정할 다른 장치를 선택한다. 14. set partition flag state : 파티션 상에 프래그를 설정한다. state는 on(켜짐) 이나 off(꺼짐) 중 하나를 입력한다. - partition : 파티션번호를 지정 - flag : boot, root, swap, hidden, raid, lvm, lba, hp-service, palo, prep, msftres - state : on 또는 off 지정. 15. name partition name : 파티션 이름을 지정한다. 뒤의 name 자리에 이름을 지정한다. 16. rescue start end : 읽어버린 파티션 정보를 찾아준다.
※ w 현재 로그인한 사용자의 정보를 보여주는 명령어 -$ w [options] [사용자] [options] -f : 원격에서 접속한 호스트의 이름을 보여주지 않는다. -h : 각 필드에 대한 head정보(uptime정보와 필드제목정보)을 생략한다. -s : 간략한 형식으로 정보를 보여준다. w명령어는 일반사용자보다는 서버관리자가 주로 사용하는 명령어이다. 물론 일반사용자들도 누가 시스템에 접속해 있는가를 확인하기 위해서 w명령어를 사용하는 경우도 종종 있으나 서버관리차원에서 관리자가 주로 사용한다.
※ who am i 현재 로그인한 사용자의 정보를 보여주는 명령어 -$ who am i [option] -f : 원격에서 접속한 호스트의 이름을 보여주지 않는다. -h : 각 필드에 대한 head정보(uptime정보와 필드 제목정보)을 생략한다. -s : 간략한 형식으로 정보를 보여준다. id 와 whoami 와 함께 로그인한 정보를 확인할 때 주로 사용하는 명령어로서
whoami보다는 보다 많은 정보를 출력해 준다.
※ whoami 현재 로그인한 사용자의 정보를 보여주는 명령어 -$ whoami whoami는 유효사용자 id, 즉 EUID(Effective User ID)를 확인하는 명령어이다. "is -un"과 동일한 결과를 얻을 수 있는 명령이며, 현재 사용권한에 대한 EUID를
확인하고자 할 경우에 사용하며 쉘 프로그램 등에서도 많이 사용된다. 비교할 명령어는 "id"와 "who am i" 가 있다.
※ Date 필요에 따라 시간과 날짜를 다양한 포맷으로 출력하는 명령어이다. -$ date [option] [+포맷] [날짜] [option] -d --date date : 지정한 date 값과 같이 시간과 날짜를 보여준다. -h : 각 필드에 대한 head 정보(uptime 정보와 필드제목정보)을 생략한다. -s : 간략한 형식으로 정보를 보여준다. date명령어는 현재 서버의 날짜와 시간을 확인하거나 설정할 수 있는 명령어이다 가끔씩 서버의 날짜와 시간이 조금씩 틀리게 되어 있는 경우 이 명령어를 이용하
여 현재 서버의 날짜와 시간을 확인하고 정확하게 설정하는 작업을 하기위해 사
용한다. date로 날짜와 시간을 새롭게 설정할 때에는 date "MMDDhhmmYY" 와 같은 형식을
사용하면 된다. 그리고 각 인수들은 아래와 같은 의미를 가지고 있다. 서버의 날
짜와 시간을 새롭게 설정할 수 있는 권한은 오로지 root만이 할 수 있다. MM 월 DD 일 hh 시 mm 분 CC 연도의 처음 두 숫자(선택적) YY 연도의 나중 두 숫자(선택적) ss 초(선택적)
날짜 및 시간 변경 date MMDDhhmmYY (월,일,시,분,년) 예) date 090210172009 달력 확인 cal 2009 지난 시간 찾기 date --date '3days ago' date --date '2months 4days' date --date '1years 1months 1days ago' 미래 시간 찾기 date --date '일 월 +%j 예) date --date '25 Dec' +%j 예) date --date '2 Sep' +%j
※ rdate 타임서버에서 시간 정보를 얻어 시스템의 시간을 변경한다. -$rdate [option] [호스트] [option] -p : 호스트의 데이터를 보여준다. -s : 원격 네트워크 호스트로부터 로컬호스트 시간을 설정한다. [사용예] [root@host1 root]# rdate -p time.bora.net rdate : [time.bora.net] Tus Sep 9 11:44:25 2009 Time Server rdate -p time.bora.net time.kriss.re.kr
※ clock cmos의 시각을 설정하는 명령어 -$ clock [option] [option] -u : CMOS의 시각을 국제시각으로 조정한다. -r : CMOS의 시각을 출력한다. -w : 리눅스 시스템 시각으로 CMOS의 시각을 조정한다. -s : CMOS의 시각으로 리눅스 시스템 시각을 조정한다. -a : CMOS의 시각으로 리눅스 시스템 시각으로 조정하고 다시 CMOS에 조정한다.
CMOS 시간
OS 시간
의 미
메인보드에 있는 rom-bios에서 인식하고 있는 시간으로 하드웨어적인 의미의 시간이다.
운영체제에서 인식하는 시간
리눅스에서 인식하는 시간
커널에서 인식하는 시간
구 분
하드웨어적인 의미의 시간
소프트웨어적인 의미의 시간
관 계
운영체제가 부팅시 마다 cmos의 시간을 가져와서 운영체제에 적용한다.
따라서 운영체제의 시간이 cmos시간에 다소 종속된다.
변경방법
clock(hwclock)명령어로 cmos 시간을 변경할 수 있다.
date 명령어로 운영체제의 시간을 변경할 수 있다.
※ top 시스템 프로세스/메모리 사용현황을 실시간으로 보여준다. - $ top [options] [options] -b : 배치모드로 정보를 출력한다. 실시간 상호 정보를 계속해서 화면에 일렬로 나타낸다. -d delay : 지정한 delay 시간(초)만큼 정보를 업데이트하여 보여준다. 디폴트 값 = 5초 -i idle : 프로세스나 zombie 프로세스를 보여주지 않는다. -n num : 지정한 프로세스 id의 정보만을 보여준다. -p pid : 지정한 프로세스 id의 정보만을 보여준다. -q : 시간의 딜레이 없이 계속된 업데이트된 정보를 보여준다. -s : 몇 몇 대화식 명령을 비활성화 한다. -S : 누적 데이터를 보여준다. -c : 옵션까지 세부 정보를 보여준다. 시스템에서 실행되고 있는 프로세스들의 실시간 정보를 확인할 수 있으며, CPU 사용정보, 메모리 사용
정보, 시스템 부하율정보등 시스템의 전반적인 상황을 한눈에 볼 수 있는 매우 유용한 명령어이다. top은 아무런 옵션없이 실행하면 5초에 한번씩 새로운 내용으로 refresh하여 보여준다.
※ chfn (root 담당) 사용자 기본 정보를 변경하는 명령어 -$ chfn [option] [사용자명] [options] -f : 사용자 전체 이름을 변경한다. -h : 사용자 집 전화번호를 변경한다. -o : 사용자의 회사명이름을 변경한다. -p : 사용자의 회사전화번호를 변경한다. chfn은 change finger의 약어로서 계정사용자의 정보를 설정하거나 변경하는 명령어이다. 사용자의 실
제 이름, 직장, 집, 전화번호 등의 정보를 입력/변경할 수 있다. /etc/passwd 파일 각행의 다섯 번째
항목 comment 항목의 값을 설정하는 것이다. chfn명령어를 사용하여 root는 모든 사용자의 계정정보를 변경할 수 있으며, 각 계정 사용자는 자기자
신의 계정 정보만을 변경할 수 있다. 이 때 root가 변경하는 모든 계정 정보들에 대해서는 패스워드 확
인절차 없이 바로 변경이 가능하지만 각 계정 사용자가 자기자신의 계정정보를 변경할 때는 자기자신의
패스워드를 입력해야 정보 변경이 가능하다. 하지만, /etc/passwd 파일을 수정하여 정보 입력도 가능하다. dhfn 사용법 1. 이름바꾸기 chfn -f [새로운 이름] [현재계정] 2. 회사명바꾸기 chfn -o [회사명] [계정명] 3. 회사전화번호바꾸기 chfn -p [회사전화번호] [계정명] 4. 집전화번호 chfn -h [집전화번호] [계정명] 확인 명령어 : finger 및 grep [계정] /etc/passwd
※ logname 로그인한 계정을 확인하는 명령어 -$ logname [options] 명령어 위치 : /usr/bin/logname [options] --help : 도움말을 보여준다. --version : 버전을 보여준다. logname 명령어는 로그인 사용자명을 출력해주는 명령어이다. 즉, A라는 계정으로 로그인한 후에 다시 su를 이용하여 수퍼유저(root)로 변경했다고 하더라도 로그인
사용자명은 여전히 A가 되는 것이다. 따라서 처음 접속될 당시의 계정명이 무엇인가라는 의미가 로그인
사용자명이라는 것이고 logname 명령으로 확인할 수 있다. ※ users 현재 시스템에서 접속한 사용자 정보 확인하는 명령어 -$ users [options] [options] --help : 도움말을 보여준다. --version : 버전을 보여준다.
※ chage 시스템 보안을 위해 사용자 패스워드 만기일을 설정/변경하는 명령어 사용자 aging 정보를 설정/변경하는 명령어 -$ chage [options] [계정명] [options] -d : 1970년 1월 1일 부터 패스워드를 마지막으로 변경한 일자. //마지막 날짜 -E : 계정사용 종료 일자. (YYYY-MM-DD 포맷으로 설정함) //만료 날짜 -I(i) : 패스워드를 유효기간 종류 이후에 계정 비활성화될 일 수 // 잠금날짜 -m : 패스워드를 변경할 수 있는 최소 일 수 (0이면 아무 때나 변경 가능) //최소 날짜 -M : 마지막 변경 이후의 패스워드 유효일 수 //최대 날짜 -W : 패스워드 만료기간 몇 일전에 안내메시지를 보낼 것인가 //경고 날짜 -I user : 사용자의 패스워드 만기 정보를 보여준다. change user password expriy infomation의 약어로서, 사용자의 여러 가지 패스워드 종료정보를 설정할 수 있다. chage는 미리 지정한 날짜에 의해 그 날짜가 지나면 패스워드를 변경하여 보다 효율적인 시스템 관리를 할 수 있도록 도와준다. 계정 aging 정보를 설정하는 것 뿐 아니라 aging 정보(aging information)를 확인 할 수도 있다. ]# grep root /etc/shadow Hong:$1$hEHG.1t5$rPqVPwlfUWmz1gTJGWMv8.:12499:0:99999:7: : : (1) (2) (3) (4) (5) (6)(7) (8) (9) (1) 계정명 : (2) 암호화된 패스워드 : (3) 최종암호 변경일 : 12499(1970년 1월1일 이후부터의 일자수) (4) 암호 변경 최소일수 : 0 (0은 아무 때나 변경 가능함) (5) 암호 변경 유예기간 : 99999(설정한 패스워드는 99999일 동안 유효함) (6) 암호변경 경고일 수 : 7(만료되기 7일전부터 로그인시에 안내메세지 출력함) (7) 암호 비활성화 기간 : 설정안됨 (8) 계정 종료일 : 설정안됨 (9) 예약필드
※ mv 특정파일 또는 디렉토리를 이동하거나 이름을 변경하는 명령어 - $ mv [options] [원본파일명] [대상파일명] - $ mv [options] [원본파일명1] [대상파일명2]...[대상폴더명] [options] -b : 백업파일을 생성한다. -i : 기본적으로 .bashrc에 alias 설정되어 있는 옵션으로, 동일한 파일이 있을 경우 사용자에게 확인을 하게 된다.
※ rename 여러개의 파일확장자를 동시에 변경할 수 있는 명령어 -$ rename [변경전파일명] [변경후파일명] [대상파일] rename 명령은 하나 혹은 하나이상의 파일명을 변경하는 명령어이다. 특정 파일의 이름을 변경하는 경우에도 유용하지만, 특정 파일의 이름을 변경하는 경우에는 mv 명령을 주로 사용한다. rename 명령어는 주로 하나 이상의 동일한 확장자를 동일한 다른 확장자로 수정하고자 할 경우에 사용한다. rename 명령어는 주로 하나 이상의 동일한 확장자를 동일한 다른 확장자로 수정하고자 할 경우에 사용한다. 예를 들어 .htm 확장자를 .html 확장자로 일괄 수정하는 경우나 .text 확장자를 .txt 로 모두 일괄 수정하는 경우가 이에 해당된다.
rename 명령어는 파일패턴문자(?,*)를 인식하기 때문에 여러 개의 파일에 동시에 사용할 수 있다.
예)rename .txt .html *.text 결과 -> 1.txt ===> 1.html 예)rename test test0 test? 결과 -> test3 ===> test03
※more 텍스트 파일 내용을 확인하는 명령어 -$more [-dlfpcsu] [-숫자] [+/패턴] [+행번호] [파일명] [사용예] h : more 명령어 상태에서 사용할 수 있는 키 도움말 확인하기 Space Bar : 다음페이지 이동하기 (f와 동일하다) Enter : 현재행에서 다음 줄로 이동하기 q : more 명령어 종료하기 f : 다음페이지로 이동하기(space bar와 동일) b : 이전페이지로 이동하기 = : 현재 위치의 행번호 표시하기 /문자열 : 지정한 문자열을 검색하기 n : /문자열로 검색한 문자열을 차례대로 계속해서 찾기 !쉘명령어 : more 명령어 상태에서 쉘 명령어를 실행하기 v : more 명령어로 열려있는 파일의 현재 위치에서 vi를 실행하기
※ wc 특정 파일의 바이트수, 단어수, 행수를 카운트하는 명령어 -$ wc [options] [파일] [options] -c : 지정한 파일의 바이트수만을 출력한다. -m : 지정한 파일의 문자수만을 출력한다. -l : 지정한 파일의 행수만을 출력한다. -L : 지정한 파일내에서 가장 긴 행의 길이를 출력한다. -w : 지정한 파일의 단어 수를 출력해준다. wc는 지정한 하나 이상의 파일들내에 존재하는 바이트 수, 단어 수, 행수를 카운트하여 출력해주는 명령어이다. 두 개 이상의 파일의 바이트수, 단어수, 행수를 카운트하면 전체 합과 함께 출력을 해준다. 예) wc install.log wc ls.txt ls2.txt (2개 파일 비교)
※ sort (기본 오름차순) 파일 내용을 정렬하는 명령어 -$ sort [options] [파일명] [options] -b : 공백을 무시한다. -d : 공백과 알파벳 문자의 순서를 비교한다. -f : 모든 문자를 소문자로 인식한다. -g : 숫자값을 비교하여 정렬한다. -i : 프린트 가능한 문자만 비교한다. -u : 필드내의 같은 값을 제거한 유일한 값만을 결과값으로 보여준다. -r : 내림차순 -k : 필드 지정으로 필드를 정렬한다. 예) sort -k 3 sort.txt 텍스트로된 파일의 행 단위 정렬을 할 때 사용하는 명령어이다. 복잡한 워드 문서 등의 편집이 아닌 간단한 텍스트문서를 대상으로 정렬작업을 할 때 주로 사용되는 명령어이다. 이 명령어는 주로 특정 DB나 프로그램, 또는 쉘 프로그램등의 입력값으로 사용되는 데이터를 직접 정렬하려고 할 때 사용된다. 문제) cat 으로 파일 만들기 -> cat > sort.txt 4 one nine 7 eight two 6 four six 9 six four 2 three seven 3 seven three 0 five five 1 nine one 8 two eight 5 ten zero
※uniq 파일내의 연속되는 문장을 확인하여 반복문장을 삭제하고 보여주는 명령어 -$ uniq [options] [파일명] [options] -c : 같은 라인이 몇 번 나오는지를 표시한다. -d : 중복되어 나오는 라인 중 한 라인만 보여준다. -D : 중복되는 모든 라인을 보여준다. -N : 필터링을 무시할 라인을 정한다. 시작 라인부터 N번째 라인까지는 검사하지 않는다. -i : 중복 라인을 한라인으로 생각하고 출력한다. -u : 중복 라인이 없는 것만 보여준다. -w N : N번째 문자까지만을 비교대상으로 하여 uniq 명령을 수행한다. 예) uniq -w 4 name -s N : N번째 문자까지는 비교대상에서 제외하여 uniq 명령을 수행한다. -f N : N번째 필드를 비교대상에서 제외하고 uniq 명령을 수행한다. ※ tr 대문자는 소문자로, 소문자는 대문자로 바꾸는 명령어 -$ tr [options] [문자열1] [문자열2] [options] -d : 지정한 파일내의 특정 문자 삭제 하기 tr 명령어는 translate 의 약어로서 지정한 문자를 바꾸어 주거나 삭제 한다. 이 명령어의 주된 용도는 파일내의 대소문자를 변경하여 내용을 원하는 포맷으로 만드는 역할이다. 사용예) cat tr | tr '[a-z]' '[A-Z]' (소문자를 LINUX is the best OS. You are a LINUXER. I am a SE. She is a programmer.
※ split 지정된 파일을 주어진 방식대로 나누는(쪼개는, 조각내는) 명령어 -$ split [options] [INPUT [PREFIX]] [options] -b : 지정한 SIZE 바이트만큼 파일을 만든다. 사용예) split --byte=200k [파일명] -aN(값) : 자동으로 생성되는 파일명의 길이 지정하기 -l : 지정한 라인(행수)만큼 파일을 만든다. 사용예) split -l 10 [파일명] Spilt는 지정된 파일을 주어진 방색대로 나누는 명령어이다. 특정 파일을 나누는 방법으로는 용량별로 나누는 방법과 행수로 나누는 방법 등이 있다. 이 명령어는 특정 파일의 용량이 너무 커서 단위별로 나눌 필요설이 있거나, 특정 목적에 의해 나누어서 사용해야 할 경우에 해당된다. split 명령어는 옵션 없이 사용할 경우 지정된 파일을 1,000행씩 나누어 저장한다. sllit 명령어의 결과로 자동 생성되는 파일들의 이름은 xaa,xab,xac,..... 등과 같은 순서대로 저장이 된다. 단, 파일명의 개수는 기본이 3문자로 생성되지만 파일명으로 사용할 문자의 개수도 지정이 가능하다.
※ cmp 두 개의 파일이 어떤 부분이 다른가를 비교할 때 사용하는 명령어 - $cmp [options] [파일1] [파일2] -l : 파일들의 차이점을 상세한 내용으로 보여준다. -s : 아무런 메세지도 보여주지 않는다. -i : 지정된 위치까지는 비교대상에서 제외하고 나머지만 비교한다. cmp는 compare의 약어로서 두 개의 파일이 어떤 부분이 다른가를 비교할 때 사용하는 명령이다. 두 개의 파일을 비교하여 단순히 같은가 다른 가를 확인할 수도 있으며, 또한, 몇 행의 몇 번째 문자가 다른가를 확인할 수도 있다. 두 파일이 동일한가를 확인하고자 할 때에 사용한다.
※ diff 두 파일에서 다른 부분을 실제 두 파일의 내용과 함께 보여주는 명령어 - $diff [options] [파일1] [파일2] - $diff [options] [디렉토리1] [디렉토리2] [options] --brief : 단순히 두 파일이 같은지 다른지를 확인한다. -c : 정의된 포맷으로 두 파일의 차이점 출력하기 -d : 두 파일의 차이점 자세히 출력하기 -r : 두 디렉토리의 차이점 출력하기 -H : 용량이 큰 파일 비교 시 속도를 빠르게 하기 diff는 differences의 약어로서, 두 파일 사이의 내용을 비교하는 명령어이다. 두 파일의 다른 점을 확인하는 명령어로는 cmp가 있지만 diff가 보다 직관적이고 명확하게 찾아준다. cmp 명령어로도 두 파일의 차이점을 확인할 수 있지만, diff명령어는 보다 다양한 형태의 비교가 가능하기 때문에 cmp 보다는 훨씬 파워풀한 비교를 할 수 있다.
※diff3 3개 파일의 차이점을 비교하여 출력하는 명령어 - $diff3 [options] [파일명1] [파일명2] [파일명3] [options] --text : 세개의 파일 비교 시 텍스트 파일이 아니더라도 텍스트 파일로 간주하여 행과 행을 각각 비교하여 그 결과를 출력해준다. diff3은 3개의 파일차이점을 비교하여 출력하는 명령어이다. 리눅스에서 파일 비교 명령어로는 "cmp, diff, diff3, comm"등의 명령어가 있다.
※type 명령어의 종류를 확인한다. - $type [명령어] 명령어는 크게 쉘 내부 명령어, 쉘 외부 명령어, Alias 등으로 구분된다. Type 명령어로 현재 사용하는 명령어가 어느 부분에 속하는지를 확인할 수 있다.
colrm 표준입력 내용의 특정열을 삭제하는 명령어 - $colrm [시작열] [끝열] colrm은 특정 파일이나 표준입력으로 주어지는 내용의 특정 열을 삭제하여 출력하는 명령어이다. 불필요한 열들을 생략하고 표시하여 주는 명령어이다.
※comm 지정한 두 파일의 행과 행을 비교할 때 사용하는 명령어 - $comm [파일명1] [파일명2] [options] -1 : 파일2를 기준으로 파일1과 비교하여 같지 않은 부분을 보여준다. 즉, 파일1에만 존재하는 라인은 출력하지 않는다. 다음 열에 공통된 부분을 출력한다. -2 : 파일1을 기준으로 파일2와 비교하여 같지 않은 부분을 보여준다. 즉, 파일2에만 존재하는 라인은 출력하지 않는다. 다음 열에 공통된 부분을 출력한다. -3 : 파일1과 파일2를 비교하여 첫 번째 열에 파일1의 유일한 부분과, 두 번째 열에 파일2에 유일한 내용을 보여준다. 즉, 파일1과 파일2에 모두 존재하는 라인은 출력하지 않는다.
※grep -q : 결과를 보여주지 않는다. -r : 각 디렉토리의 하위 파일들을 읽는다. -s : 존재하지 않거나 읽을 수 없는 파일에 대한 결과로 보여주는 에러를 보여주지 않는다. -v : 지정한 패턴과 일치하지 않는 것들을 보여준다. -w : 한 단어를 일치하는 결과만을 보여준다.
grep에서 사용되는 검색 문자 패턴 정규표현식 1. . : 아무 문자나 한 문자를 의미한다. 2. * : 어떤 문자열이나 문자길이에 무관한 문자열을 의미한다. 3. ^ : 행의 시작 위치를 의미한다. 4. $ : 행의 마지막 위치를 의미한다. 5. [] : 한 문자 길이의 패턴 리스트 의미한다. 6. [^ ] : 지정된 문자들 이외의 문자들을 의미한다. (^는 여집합을 의미) 7. \ : 뒤에 오는 문자를 문자 그대로 인식한다. (특수문자를 표현하고자 할 때 사용한다.) 8. /< : 단어의 시작 위치를 의미한다. 9. /> : 단어의 마지막 위치를 의미한다.
사용예) 특정파일내에서 지정된 문자열 찾기 grep linux text.txt | wc -l wc -l install.log 사용예) 특정파일내에서 지정된 문자열행수 출력 grep -c linux install.log 사용예) 특정파일내에서 지정된 문자 제외하고 출력 grep -v linux install.log 사용예) 대소문자 구분없이 지정문자 검색하기 grep -i linux install.log 사용예) 디렉토리내에서 특정리스트만 검색 ls -l /etc | grep "^d" (폴더에서 앞글자가 d로 시작하는것) ls -l /etc | grep -c "^d" 사용예) 특정디렉토리내에 존재하는 파일들을 한꺼번에 편집기(vi)로 수정하기 = 강추 ls -l | grep "^" | awk '{print "vi "$9}' > test.sh 퍼미션:링크수:UID:GID:용량:연도:월일:시간:이름 1 2 3 4 5 6 7 8 9
실습 = 파일 5개 생성 test1 ~ 5 각 파일별 내용 삽입 = test 11111111111111 제작 추가작업 : test -> guest ls test1 test2 test3 test4 test5 각각의 파일을 vi로 열어서 수정해준다. 결과 vi vi test1 vi test2 vi test3 vi test4 vi test5
test.sh 파일생성 후 추가작업 1. 내용편집 : .sh 실행파일(쉘스크립트)쉘 선언 #!/bin/bash 추가해준다 --- 첫번째 행에 추가 2. 퍼미션 설정 기본 UMASK값 022 = 파일이면 644 -rw-r--r-- 이 상태는 실행권한이 없다. 퍼미션 => 755 -rwxr-xr-x 실행권한 부여 ※ awk 특정 패턴의 문자들을 원하는 포맷으로 변경하는 명령어 - $awk [options] ['script] [변수=값] [파일.....] - $awk [options] [-F] ['{script}' awk는 1977년 bell 연구소의 alfred v. Aho'peter j. Wenberger 와 Brian W. Kernighan에 의해 특정문자의 패턴을 원하는 포맷으로 처리하기 위해 개발된 쉘에서 바로 사용 가능한 일종의 유틸리티이며, 언어이며, 영문으로는 "pattern scanning and processing language"라고 매뉴얼 되어 있다. 즉, 테스트파일로 입력을 받아들여 목적에 맞게 출력할 수 있는 문자처리 언어이다. 특정 문자들을 원하는 포맷에 맞게 출력하기 위해 주로 쉘프로그램이나 쉘에서 바로 사용된다. awk는 gawk로 링크되어 사용하므로 둘은 같은 명령어라고 할 수 있다. awk를 사용하기 위해 꼭 알아두어야 할 것은 awk는 기본적을 탭 또는 공백으로 구분되는 각각의 단어들을 하나의 변수로 처리한다. 탭과 공백을 무시하고 특정문자 콜론(:)이나, 세미콜론(;), 콤마(;)등을 구분문자로 사용하고자 한다면 -F 옵션을 사용하면 된다. 예를 들어 "-F:" 으로 지정했다면 ":" 콜론을 구분문자로 하여 단어와 단어 사이를 처리하게 된다. 예를 들어 "-F;" 으로 지정했다면 ";" 세미콜론을 구분문자로 하여 단어와 단어 사이를 처리하게 된다. [awk] 예제파일 /etc/passwd 계정:패스워드:UID:GID:코멘트:~계정:사용쉘 $1 $2 $3 $4 $5 $6 $7 목적 : passwd -> gropu/shadow 생성 $ = field 열을 뜻함. ]# cat /etc/passwd | awk -F: '{print $1}' passwd 파일에서 사용자ID 항목만 출력 ]# cat /etc/passwd | awk -F: '{print $1" "$6}' passwd 파일에서 사용자ID/홈디렉토리를 출력 ex1) passwd => group 파일생성 ]# cat /etc/passwd | awk -F: '{print $1":x:"$3":"}' > /tmp/test/group ex2) passwd => shadow 파일 생성 ]# grep /home /etc/passwd | awk -F: '{print "grep "$1" /etc/shadow"}' > /tmp/test/shadow.sh ex3) 사용자 홈디렉터리 일괄 백업하기 ]# ls -l /home | grep "^d" | awk '{print "tar cvfpz " " /tmp/test/"$9".tar.gz" " /home/"$9}' > backup.sh
※ ps - 프로세스의 현재 상태를 보여주는 명령어 -$ ps [options] [option]
pstree : 프로세스 종속연결 확인 kill 프로세스번호 : 불필요한 프로세스 삭제 kill -9 프로세스번호 : 완전 삭제 -a : 다른 이용자의 프로세스까지 나온다 -e : 작업환경까지 나오게 한다. -f : 전체 경로로 프로세스를 표시한다. -l : 자세한 정보를 보여준다. -m : 메모리 정보까지 나온다 -r : 현재 실행하고 있는 프로세스를 보여준다. -u : 각 프로세스의 이용자 이름과 시작 시각을 보여준다. -v : 가상 메모리를 얼마나 쓰는지 나온다. -w : 긴(wide) 형태로 출력한다. 한 행 안에 출력이 잘리지 않는다. -x : 로그인 상태에 있는 동안 아직 끝나지 않은 프로세스를 보여준다. 자주 쓰는 명령어 ps -ax : 작동 안하는 모든 프로세스를 보여준다. 루트(root)권한으로 다른 사용자들의 프로세스를 확인 하므로 필요 없거나 문제가 되는 프로세스를 확인할때 많이 쓴다. ps -ef : 작동환경과 프로세스 프로그램의 전체 경로를 보여준다. 어떤 계정에서 실행했는지 알 수 있기 때문에 해킹이나 위험한 동작을 하는 프로세스가 있다면 이것을 실행항 계정을 알 수 있다.
※ ls -파일의 목록을 출력 디렉토리의 파일리스트를 확인하는 명령어 -$ ls [options] [디렉토리명] [파일명] [options] -a : .을 포함한 경로안의 모든 파일을 보여준다. -c : 파일의 최근 변경시간에 따라 정렬하여 보여준다. -d : 경로안의 내용을 나열하지 않고 보여준다. (쉘 스크립트에서 유용하게 쓰임) -f : 디스크에 저장된 순으로 보여준다. -i : 파일 왼쪽에 색인 번호를 보여준다. -k : 파일을 KB단위로 보여준다. -l : 파일형태, 사용권한, 하드링크번호, 소유자, 그룹, 파일크기, 시간, 연도, 파일명 순으로 보여준다. -m : 파일을 가로로 나열한다. -n : 이름 나열에서 UID, GID를 사용한다. -p : 파일형태를 지시하는 문자를 각 파일에 추가한다. -r : 내림차순으로 보여준다. -s : 파일크기를 1kb단위로 보여준다. -t : 최근 파일순으로 보여준다. -u : 파일 사용순으로 보여준다. -x : 정렬방식을 가로로 한다. -A : . ..을 제외한 경로안의 모든 파일을 보여준다. -B : 파일 끝이 ~인 파일은 제외하고 보여준다. -C : 정렬을 세로로 한다. -F : 파일 형식을 알리는 문자를 각 파일 뒤에 추가한다.
파일구분 특수표시 ls -F 1. 일반파일 : 아무런 표시 없음 2. 디렉토리(폴더) : / 표시 3. 실행파일 : * 표시 4. 심볼릭링크파일(바로가기 아이콘) : @ 표시 5. FIFO파일(shell파일) : |(파이프) 표시 6. 소켓파일 : = 표시 -G : group 정보를 제외한다. -L : 심볼릭링크 파일들을 일반 파일로 보여준다. -R : 하위 경로와 그 안에 있는 모든 파일들도 보여준다. -S : 파일 크기가 가장 큰 것부터 보여준다. -U : 디스크에 저장된 순서대로 보여준다. -1 : 한줄에 하나의 파일만 보여준다. -w : 가로 출력값을 지정한 값으로 보여준다. (기본값 80) --clolr=no : 파일구분의 색지정을 하지 않는다. -u : 파일 사용순으로 보여준다. -x : 정렬방식을 가로로 한다. ls 는 특정 디렉토리의 파일리스트를 확인 하는 명령어이다. 리눅스의 가장 기본적인 명령어이지만 단순히 특정 디렉토리의 내용만을 확인하는 용도로만 쓰이는 것은 결코 아니다. 특정 파일의 정렬도 가능하며, 큰 파일사이즈를 찾을 수도 있고, 쉘 프롬프트의 색지정도 할 수 있고, 이외에도 매우 편리하고 강력한 기능들이 있다. 참고로 특정 디렉토리의 파일리스트를 확인하는 명령어는 ls, dir, vdir 3개가 있다. ls 명령어를 제대로 이해하려면 다음 3가지 의미를 정확하게 이해하고 있어야 한다. 1.Atime - access time을 의미한다. - 파일이라면 vi등으로 열어본 시간을 뜻한다. - 디렉토리라면 cd로 접근하여 ls로 디렉토리의 내용을 확인한 시간을 뜻한다. * ls -ult 2.Mtime - modification time을 의미한다. - 파일이라면 파일 내용이 변경된 시간을 뜻한다. - 디렉토리라면 디렉토리의 내용이 (파일삭제, 생성 등) 변경된 시간을 뜻한다. - ls -l에서 출력되는 시간이다. 3.Ctime - creation time 을 의미한다. - 파일의 속성이 변경된 시간을 뜻한다. - chmod나 chown등으로 파일의 속성이 변경된 시간을 뜻한다. * ls -clt
※ cat file [ > | >> ] [저장할 file] - 파일의 내용을 표준 출력으로 보여주는 명령 여러 개의 기존 파일들을 하나로 병합, 텍스트 파일 내용을 표준 출력으로 보여준다. cat name1 name2 name3 > mergefile (name1,2,3 파일은 mergefile로 병합) cat name1 >> name2
-$ cat [options] [파일][파일].... [options] -b 공백을 제외한 파일 내용의 줄의 맨 앞에 줄 번호를 표시. -E 각 줄의 끝에 $로 끝나는 줄을 나타낸다. -n 모든 줄 앞에 1부터 시작하는 줄 수를 표시한다. -s 공백의 줄 수를 하나 이상 보여주지 않는다. -T 탭 문자를 ^| 로 표시한다.
※ touch 파일 or 디렉터리 생성
빈 파일을 생성시키는 명령, 파일을 만들고 파일에 접근하거나 수정한 시간을 변경. - $ touch [options] [파일명] [options] -a 최근 파일 사용시간만 업데이트 한다. -c 파일이 있으니까 파일을 생성하지 않는다. 예)touch -c -t 0821010 abc -d time 현재시간 대신 지정한 시간으로 변경한다. -m 파일이 수정된 시간을 변경한다. 예) touch -m abc 666(666파일날짜를 abc파일날짜와 동기화) -r file 지정한 파일의 시간으로 변경한다. 예) touch -r abc * -t time 현재시간 대신 지정한 시간으로 변경한다. (MMDDHHMM 형식 입력) 예) touch -t 0821010 abc
※ cd - 디렉토리 이동, 이동 방법은 절대경로 참조, 상대경로 참조, 계정 참조 방식 존재
.. :상위 디렉토리 . :현재 디렉토리 cd - : 이전 디렉토리로 이동 cd ~ : root 이동
※ cp [-Rf] source file or dir destination file or dir - 파일이나 디렉토리를 복사하는 명령
-R : 하위 디렉토리까지 복사 -f : 기존파일이 있을경우 덮어씌움
※ mv [-f] source file or dir destination file or dir - 파일이나 디렉토리를 이동시키는 명령어 파일이나 디렉토리의 이름을 변경시 사용가능 -f : 기존파일이 있을경우 덮어씌움
※ rm [-f] source file or dir - 파일이나 디렉토리를 삭제하는 명령어 -f : 무조건 삭제 -i : 삭제시 삭제할 것인지 확인
-r : 하위디렉토리까지 모두 삭제
※ mkdir [-p] dir - 디렉토리 생성 명령어 설정을 하지 않을 경우 기본적으로 755의 실행 권한을 갖는다. -p : 하위 디렉토리까지 한번에 생성
-m mode : 새로 만들어 지는 디렉토리의 권한 설정 예)mkdir -m 750 park 폴더의 권한은 기본적으로 755를 준다. 022 - 777 = 755 022 - 666 = 644 umask 변경 vi /etc/bashrc
※ find - 특정 파일을 검색하는 명령어 find . ?type d : 하위 디렉토리 목록 출력 find . ?type f ?name “*.txt” : txt로 끝나는 파일 이름 출력
※ chattr, lsattr - 중요파일은 보호속성을 설정한다 속성 변경(+ : 속성 부여, - : 속성 해제, = : 속성 지정) - $ chattr [options] [파일명] - $ lsattr 명령으로 chattr 모드를 확인할 수 있다. [options] -R 디렉토리와 그 이하 모든 속성을 변환시킨다. -V 변화된 속성에 대하여 자세히 출력한다. -v 버전확인 -a 파일을 추가모드로만 열 수 있다. -c 커널에 의해 디스크 상에 압축 상태로 저정된다. -d dump 명령 수행 시 백업되지 않는다. -i 파일을 수정할 수 없다. 오직 슈퍼유저(root)만이 변경 가능하다.(root만 설정가능) -s 파일이 지워질 때 일 단 블록들이 모두 0이 된 다음 디스크에 기록된다. -S 파일이 수정될 때 그 변화가 디스크 상에 동기화 된다. -u 파일이 지워지면 내용이 저장된다.
※ finger - 사용자 정보를 찾는다. -$ finger [options] [username/domain] [options] -l 멀티라인 형식으로 사용자 홈 디렉토리, 집전화번호, 로그인 쉘, 메일, 홈디렉토리 파일 등과 함께 -s 옵션으로 보이는 정보를
보여준다. -s 사용자의 로그인 이름, 실제이름, 터미널 이름, 상태, idle 시간, 로그인 시간, 사무실 이치, 사무실 전화번호를 보여준다.
※ vm 툴 설치 mkdir /tmp/cd (cd 디렉토리 생성) mount /dev/cdrom /tmp/cd (cd 디렉토리를 cd-rom 으로 이용) cd /tmp mkdir /tmp/cd2 (vm 인스톨 파일 저장 디렉토리 생성) cp VMware-linux-tools.tar.gz /tmp/cd2 cd /tmp/cd2 tar zxf /tmp/cd2/vmware-linux-tools.tar.gz (압축해제) umount /tmp/cd cd vmware-tools-distrib ./vmware-install.pl
※ 리눅스 제거 - 리눅스 윈도우 부팅디스켓 준비(fdisk.exe 포함) 리눅스 부팅 후 리눅스 fdisk 명령이용 파티션 삭제 윈도우 부팅디스켓으로 부팅 후, fdisk.exe /mbr 명령으로 부트로더 제거 - 윈도우 윈도우 부팅디스켓으로 부팅 후, fdisk 명령이용하여 non-dos 파티션 제거 fdisk.exe/mbr
※ mount -파일시스템을 마운트하여 사용할 수 있게 만든다. -$ mount [options] [장치명] [마운트디렉토리] [options] -a : /etc/fstab에 기술되어 있는 모든 파일시스템을 마운트 한다. noauto 옵션은 자동마운트에서 제외된다. -f : 실제 시스템 호출은 하지 않고 마운트할 수 있는지 점검한다. -l : 마운트한 파일시스템의 정보를 보여준다. -n : /etc/fstab 파일에 쓰기 작업을 하지 않고 마운트 한다. /etc가 읽기전용 파일시스템인 경우에 필요하다. -r : 읽기만 가능하게 마운트 한다.(=-o:ro) -w : 읽기/쓰기 모드로 마운트 한다.(Default. =-o:ro) -t 파일시스템 : 파일 시스템 형식을 지정한다. -o : -o 옵션 뒤에 콜론(:)으로 다음 옵션 중 필요한 것을 선택하여 사용한다. async : 파일시스템에 대한 I/O가 비동기적으로 이루어지도록 한다. auto : -a 옵션으로 마운트한다. defaults : rw, suid, dev, exec, auto, nouser, async를 기본 옵션으로 한다. dev : 파일시스템 상의 문자, 블록 특수 장치를 해석한다. exec : 바이너리의 실행은 허가한다. noauto : -a 옵션으로 마운트 되지 않는다. nodev : 파일시스템상의 문자, 블록 특수 장치를 해석하지 않는다. noexec : 파일시스템에 실행권한을 주지 않는다. nosuid : set-UID, set-GID를 무시하게 한다. nouser : 일반 사용자는 마운트를 못하게 한다. remount : 이미 마운트된 파일시스템을 다시 마운트 한다. ro : 파일시스템을 읽기만 가능하게 한다. rw : 읽기/쓰기 모두 가능하게 마운트 한다. suid : set-UID, set-GID 가 효력을 발휘할 수 있게 해준다.
cdrom 마운트 : mount -t iso9660 /dev/cdrom /mnt/cdrom
※ umount - 마운트한 장치를 해제한다. -$ umount [options] [장치명] -$ umount [options] [-t 파일시스템속성] [장치명] [options] -v : umount한 내용을 보여준다. -n : /etc/mtab 를 갱신하지 않고 umount한다. -a : /etc/mtab 파일에 모든 파일 시스템을 umount 한다. -t 파일시스템속성 : umount 하고자 하는 파일시스템의 종류를 지정한다. 둘 이상은 콤마(,)로 구분한다. no를 접두사로 사용하면 특정 속성의 파일시스템을 umount 리스트에서 제외할 수도 있다.
※ pstree 프로세스의 관계를 트리구조로 보여주는 명령어 -$ pstree [options] [pid] [user] [option] -a : 명령행에서 지정한 인수가 있다면 명령어 라인 인수까지 보여준다. -c : 기본값은 동일한 트리 내의 같은 프로세스를 하나의 프로세스만 보여주고
해당 프로세스의 개수를 나타내는데, 같은 프로세스를 모두 보여준다. -G : 트리 형태를 보기 좋게 VT100 형태로 보여준다. -h : 현재 프로세스와 부모 프로세스를 하이라이트로 보여준다. -H pid : pid로 지정된 프로세스와 부모 프로세스를 하이라이트로 보여준다. -l : 긴라인을 모두 보여준다. -n : PID를 기준으로 정렬하여 보여준다. -p : PID까지 보여준다. -u : UID를 보여준다. -U : UTF-8 형태로 보여준다. pid : 지정하는 pid를 보여준다. user : 지정하는 사용자만의 프로세스를 보여준다.
shutdown -h now = init 0 = halt
※ 시스템 종료 / 재시작 -$ shutdown [options] [시간] ["경고메시지"] [option] -t sec : 지정한 시간에 시스템을 재시동한다. -h : shutdown이 완료된 후 시스템을 종료한다.(프로세스를 저장하고 종료) -r : 시스템 종료 후 재 부팅한다. -c : 진행중인 shutdown 명령을 취소한다. -f : 재부팅이 될 때, fsck 명령을 건너 뛰면서 빠른 재부팅을 한다. -k : 경고 메시지만을 보여주고, 실제적인 shutdown을 진행하지 않는다. -n : shutdown을 위해 init를 호출하지 않고 진행한다. now : 지금 바로 종료한다. +m : 지정한 m분 이후에 종료한다. hh:mm : 지정한 시:분 후에 종료한다.
※free 시스템의 빈 메모리와 사용한 메모리의 양을 출력하는 명령어 -$ free [-b | -k | -m] [-o] [-s delay] [-t] [-v] [option] -b : 메모리의 양을 바이트로 표시한다. -k : 메모리의 양을 킬로바이트로 표시한다. -m : 메모리의 양을 메가바이트로 표시한다. -t : 총계가 포함된 줄을 출력한다. -o : buffer/cache 라인을 보여주지 않는다. -s sec : 지정한 초단위로 refresh하여 메모리 상태를 표시한다. free 명령어로 다음과 같은 내용들을 확인할 수 있다. - 메모리의 전체 용량 - 유휴메모리의 량(움직임이 없는 메모리) - 사용중인 메모리의 량 - 스왑(swap) 메모리의 량 - 커널에서 사용되는 공유메모리(shared memory)와 버퍼(buffer)의 량 - 캐시된 메모리의 량
※ id 사용자의 UID, GID 번호 및 현재 셀에서 id 정보를 보여준다. -$ id [options] [사용자] [option] -g : 사용자의 그룹 id 만 보여준다. -G : 추가 그룹의 id 만 보여준다. -n : -u, -g, -G 옵션과 같이 쓰여 해당하는 id의 이름만을 보여준다. -r : -u, -g, -G 옵션과 같이 쓰여 해당하는 실제 id를 보여준다.
※ hostname 파일설정 /etc/sysconfig/network 시스템의 이름보기 -$ hostname [options] [파일명] [option] -a : alias 명을 보여준다. -d : 도메인을 보여준다. -F : 파일로부터 호스트 이름을 받아서 설정한다. -i : 호스트의 ip address를 보여준다. -s : FQDN에서 첫 번째 옥텟 앞부분을 보여준다. -y : NIS 도메인 이름을 보여준다.
※ logout 현재 시스템에서 모든 작업을 종료한다. -$ logout logout은 현재까지 시스템에서 사용중인 모든 작업을 종료하고 시스템에서 빠져 나가는 명령어이다. 단순히 시스템을 빠져나가는 것이 아니라 logout이란 명령어에는 현재 까지 사용중인 모든 자원을 커널에게 반납하고 부여받았던 모든 권한을 종료한다는 의미까지 포함되어 있다. 이와 같은 명령어로는 exit가 있다.
※ reboot 시스템 재 부팅 -$ reboot [options] [option] -d : wtmp 파일에 기록을 남기지 않는다. -f : 강제로 재 부팅한다. -n : 재 부팅할 때 sync 하지 않는다. -w : 실제적으로 재 부팅하지 않고 /var/log/wtmp 기록을 남긴다.
halt와 poweroff는 시스템 종료 후에 시스템의 재부팅을 하지 않지만 reboot은 시스템종료 후에 재부팅을 한다는 점에서 차이점이 있다. ]# reboot = init 6 = shutdown -r now
■ 사용자 계정 - 시스템에서 한 사용자를 생성한다는 의미는 수용되는 시스템에서 사용자가 사용할 수 있는 모든 설정들을 해줘야 하며 단순히 id와 패스워드 생성외에도 다음과 같은 작업을 해야 한다.
* 사용자 계정 생성 1. /etc/passwd 파일에 사용자의 계정(id 및 패스워드)생성 2. /etc/group 파일에 사용자의 그룹생성 3. /home에 사용자의 홈디렉토리 생성 4. 사용자의 로그인 정보 및 환경설정 5. 사용자의 디렉토리 및 파일 소유권 변경 및 확인 6. DB사용을 위한 환경설정 및 응용프로그램 사용을 위한 환경 설정 7. 기타 응용 소프트웨어 사용을 위한 설정 등
※ useradd [옵션] [계정명]
이 작업이 정상적으로 종료가 되면 아무런 메시지 없이 쉘 프롬프트가 나오며 작업의 결과 /etc/passwd에 계정등록 /home/testuser의 홈디렉토리의 생성된다. -c : commnet 사용자의 계정을 생성하면서 동시에 사용자의 finger정보를 함께 입력할 수 있다.
확인 : cat /etc/passwd
-d : home directory 사용자의 홈디렉토리는 /home 디렉토리 아래 생성된다. 그러나 이 옵션을 지정하면 원하는 위치에 지정할 수 있다.
-e : expire date 임시적으로 발급하는 계정 -e 다음에 적은 날짜까지만 사용 가능한 계정이다. 날짜의 형식yyyy-mm-dd이다.
14478 = 날짜적용
-f : inactive_days -e와 같은 옵션이다. 날짜를 지정하는 것이 아니라 얼마 남았는지 지정한다. 5라고 하면 5일 동안 사용할 수 있는 계정이다. 기본값은 -1이다. 0으로 하면 만료가 되기 때문이다.
-g : initial_group 반드시 존재하는 그룹의 이름이나 ID number로 새로운 계정의 Group ID를 정할 수 있다.
-G : 새로운 사용자가 포함되는 여러 그룹을 지정할 수 있다. -u UserID : 새로운 사용자 ID값을 지정하나. 사용자 ID값은 /etc/passwd 파일로 확인할 수 있다. -p : useradd -p [password] [계정명]후에 passwd를 사용하지 않아도 한번에 패스워드까지 만들 수 있다. 예) useradd -p `openssl passwd 123456` rang
-s shell : 새로운 사용자의 Shell을 정의한다.
-m -k skel_dir : skel 디렉토리를 지정한다. -u : user id 사용하다 보면 삭제된 아이디들이 있다. User id의 수가 연속적이지 않을 때 user id를 지정하는 옵션이다.
수는 음수를 지정해서는 안 된다.
※ usermod [options] [계정명]
-c comment 사용자의 설명을 변경한다.
-i 사용자 id 사용자의 id를 변경한다.
-d homedirectory 사용자 홈 디렉토리 위치를 지정한다.
-p 패스워드 : 사용자의 패스워드를 지정
-e date 사용자의 사용기간을 제한한다. (yyyy-mm-dd)
-s shell : 사용자의 쉘을 지정한다.
-f 남은 날수 : 임시 사용자의 사용 제한한다.
-u UserID : 사용자의 ID값을 변경한다.
-g 그룹 : 새로운 사용자의 그룹을 지정한다.
-L : 사용자의 패스워드를 막아 놓아 접근을 막는다.
-G 그룹... : 사용자가 포함되는 여러 그룹을 지정한다.
-U : 사용자의 접근을 막은 패스워드를 풀어준다.
※ userdel [-r] username - 사용자 제거
- r : 사용자 홈 디렉터리 제거
alias c='clear' (엘리어스 바로 적용, 로그아웃 하면 없어짐)
리눅스를 설치하는데 반드시 필요한 두 파티션 : 루트 파티션, 스왑 파티션 루트 파티션 : 시스템 파일과 사용자 개인파일을 비롯하여 모든 파일이 저장되는
DWORD end=GetTickCount(); GetTickCount()은 시스템이 시작한 시각부터 밀리센컨 단위로 리턴 1000=1초
===============================================
팝업 메뉴
CMenu menu, *pMenu;
menu.LoadMenu(IDR_POPUP); //리소스 뷰에서 ID IDR_POPUP 메뉴 를 로드한다 pMenu=menu.GetSubMenu(0); //ID IDR_POPUP 메뉴의 첫번째 서브 메뉴를 로드한다 ASSERT( pMenu); pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,pt.x, pt.y,this);//팝업메뉴 보이기
=================================================
printf,sprintf 표기자리수
sprintf(x,"%05.1f",float); 일경우 소수점 포함 5자리보장하고 소수점 이하는 한자리 표기 보장
메인 스레드에서 만든 윈도의 핸들(정확히 핸들을 가지고있는 캡술화된 객체)은 당연 메인 스레드가 가지고 있다.
이 윈도우를 다른 쓰레드에서 사용시 객체로 접근하면 ASSERT 에 잡힌다.
객체보다는 핸들로 접근하라고 권고함 (FromHandle)
Note: if either of the above asserts fire and you are writing a multithreaded application,it is likely that you have passed a C++ object from one thread to other and have used that object in a way that was not intended. (only simple inline wrapper functions should be used)
In general, CWnd objects should be passed by HWND from one thread to another. The receiving thread can wrap the HWND with a CWnd object by using CWnd::FromHandle.
It is dangerous to pass C++ objects from one thread to another, unless the objects are designed to be used in such a manner.
ActiveX에서 파일 소켓 UI스레드 쓰실수있습니다. 모두 사용가능하다는 말이죠. 단, 각 파일,소켓,UI스레드들이 MFC Object인경우 (CFile, CXXSocket) 라면 해당 Object을 생성한 스레드에서만 되도록 사용하도록 하세요. Object 포인터만 스레드를 넘어가서 사용하다보면 Window의 경 우 MFC Thread 구조체내에 핸들맵에 없어 핸들을 찾지 못하거나 소켓역시 그럴수 있죠. 그럼 핸들이 없다고 뻑나죠. 만일 소켓을 엑티브X의 UI스레드에서 하고 싶으시면 아래처럼 해보세요. UI스레드를 엑티브x에서 생성합니다. UI스레드의 OnIniInstance부에서 AfxSockInit()해줍시다. CSocket등의 MFC소켓을 UI스레드에서 생성하여 UI스레드에서만 억세스하도록합시다. 엑티브X(메인스레드)와 UI스레드와의 통신이 필요할시엔 PostThreadMessage 또는 윈도우있는 엑티브x에게는 PostMessage를 이용합시다.
◆1.OnLButtonDown에서 최초 point를 얻는다.. 2.OnMouseMove에서 변환되는 point를 계속적으로 얻는다. (결국은 최종 point를 저장하면 되니까..)
SetRop2(R2_NOT);으로 그리기 모드 변경... CPen pen(PS_DOT,......);으로 선모양을 점선으로 변경 선을 두 번 그려준다. (R2_NOT 모드이므로, 두번 그리면 지웠다 그렸다 하는 작업을 반복하죠..)
3.OnLButtonUp에서 SetRop2(R2_NOT)해 준다.. (OnMouseMove에서 마지막에 그려진 점선을 지우기 위해) CPen pen(PS_DOT..,...); Rectangle함수로 최초point부터 최후 point까지 한번 다시 그려준다. (역시 마지막 점선을 지위기 위해)
최초 point와 최후 point를 가지고 CRect, 혹은 CRgn 객체를 하나 만든다..
Generic-Text Data Type Name SBCS (_UNICODE, _MBCS Not Defined) _MBCS Defined _UNICODE Defined _TCHAR char char wchar_t _TINT int int wint_t _TSCHAR signed char signed char wchar_t _TUCHAR unsigned char unsigned char wchar_t _TXCHAR char unsigned char wchar_t _T or _TEXT No effect (removed by preprocessor) No effect (removed by preprocessor) L (converts following character or string to its Unicode counterpart)
위에서 보시는 것과 같이 SBCS(Single Byte Character Set: 영 어), MBCS(Multi Byte Character Set: 한글), UNICODE,
에 따라 서로 다른 유형이 사용됩니다.
그러나 일반 유형(Generic Type)을 사용하시면, 컴파일러가 자동 으로 상황에 맞는 유형으로
int) 와 같은 casting은 C type casting이고 static_cast 와 같은 casting은 c++에서 새로 도입된 casting 방법입니다.
몇 가지에 대해 테스트해보시면 아시겠지만 static_cast가 훨씬 더 엄격하게 type checking을 합니다. 따라서 C type casting 보다 실수를 줄일 수 있는 가능성이 많 죠.
만약 static_cast로 해서 안되는 것은 reinterpret_cast로 하시 면 됩니다만, 제대로 된 C++ program이라면 reinterpret_cast나 C type casting이 별로 없어야 합니다. 왜냐 하면 C++은 type checking이 엄격한 언어이고, C에서 부득 이하게 void pointer 등을 사용하여 type safety를 잃어버리는 코딩 방법을 여러 OOP 방법들이 대체할 수 있기 때문입니다. ////////////////////////////////////////////////////
기존의 괄호를 사용하여 캐스팅하는 C언어 방식의 캐스트의 문제 점은... 이게 어떤 의도를 가지고 캐스트 되는지 컴파일러가 알지 못했다는 것입니다.
이러한 연유로 하여 C++ 표준에서는 static_cast 말고도 const_cast, dynamic_cast, reinterpret_cast등으로 세분화 하였습니다.
이 4가지의 캐스트 오퍼레이터들은 각각 자신만의 특징을 가지 고 있답니다. 따라서 이 캐스트를 사용하면 컴파일러에서는 사용자가 어떠한 목적으로 캐스트를 시도하였는지 알 수 있기 때문에 실패하더라도 더 자세한 에러 정보를 사용자에게 줄 수 있는거지 요..
각각의 캐스팅 연산자들의 차이점은 검색을 해보시면 할 수 있으 실 거구요...
기본적으로 static_cast는 C언어에서 가장 유용하게 사용되는 cast의미와 동일합니다. //////////////////////////////////////////////////////// BYTE Btemp = (BYTE)temp; 보다는 BYTE Btemp = static_cast(temp); 를 추천하고 싶습니다. C++에는 static_cast, dynamic_cast, const_cast, reinterpret_cast가 추가되었고 C style의 cast 보다는 위 4개의 keyword를 사용한 casting을 대 부분의 C++ 책에서 추천 하고 있습니다. ///////////////////////////////////////////
기존의 C에 있던 cast 연산에는 몇가지 문제가 있었습니다. 예를 들어 다음과 같은 문장을 보면
Data* data = (Data*)pSomething;
여기서 쓰인 cast가 무엇인지 알수 있는 방법이 없습니다. 코드 를 보는 사람뿐 아니 라 컴파일러도 알수 없겠죠. 따라서 컴파일러는 무조건 casting 을 하게 됩니다. 또 한 후에 아주 긴 코드상에서 cast한 부분만을 보고자 할때도 검 색어로 괄호를 넣을수 도 없고 난감하지요.
이러한 몇가지 점을 보완하고 개발자들에게 여러가지 편리함을 주고자 C++에서는 네 가지 cast operator가 정의되었습니다. static_cast, dynamic_cast, const_cast, reinterpret_cast가 그것입니다.
간단히 설명을 하자면 다음과 같습니다.
static_cast - 기본적으로 기존 C에서 casting하던 것과 같은 역 할을 합니다. 따 라서 기존의 C의 casting으로 안되던 것들은 이것으로도 되지 않 습니다. 또한 const형을 non-const형으로 cast하는 것 역시 이 연산자로 할수 없습니다.
const_cast - const형 데이터를 non-const형으로 바꾸거나 volatile형을 non- volatile형으로 cast해 줍니다. 다른 용도로는 사용할 수 없습니 다.
dynamic_cast - class들의 inheritance hierachy들 사이를 올바 르게 cast하는 데 사용됩니다. 다른 용도로는 사용할수 없습니다. 이 기능은 RTTI(Run-time Type Information)기능을 참고하시면 도움이 되실 겁니다. 참고 로 이 연산자는 올 바로 cast되지 않는 경우에는 null을 return하기 때문에 매우 유 용하게 사용됩니 다.
reinterpret_cast - 이 cast는 보통 구현에 따라 다르게 작업을 수행한다고 되어 있습니다. 따라서 이 연산자는 다른 컴파일러에 porting이 어렵 다고 되어 있습니 다. 보통 위의 세가지 cast로 불가능한 casting을 할때 사용되 며 서로 다른 프로토 타입을 가진 함수 포인터를 casting하는데 주로 사용이 됩니다.
다시 위의 예로 돌아가면
Data* data = const_cast< Data*>(pSomething); Data* data = dynamic_cast< Data*>(pSomething); Data* data = static_cast< Data*>(pSomething);
와 같은 문장이 있다면 왜 casting이 필요했는지를 쉽게 이 부분 의 코드만 봐도 확인 이 되겠지요. 물론 컴파일러도 좀더 효율적이고 정확하게 컴파일 이 가능할테고요.
마지막으로 C++에 관련된 책중에 여러가지 item으로 구성되어 있 어서 재밌고 유용하 게 읽을수 있는 책으로
Effective C++, by Scott Meyers, Addison Wesley More Effective C++, by Scott Meyers, Addison Wesley
가 있습니다. 꼭 한번 읽어 보세요. 그냥 C++책이나 object- oriented 관련 서적 을 읽는 것과는 다른 맛(?)이 있습니다.
보통 윈도우 ODBC를 설정했을시 방법 return _T("ODBC;DSN=Video_Driver");
2.윈도우 ODBC설정없이 소스에서 설정하기.. 2-1. FileDSN을 사용. (윈도우의 ODBC설정시 "FILE DSN"을 선택하여 DSN화일 을 만든후 그화일을 사용한다. return _T ("ODBC;FileDSN=C:\\video_job\\video.dsn"); 2-2. 그냥 소스에서 모든걸 설정하기. (위의 FileDSN을 만든후 생성된 DSN화일을 참고로 한 다) return _T("ODBC;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:\\video_job\\Video.mdb");
**연결할 환경이 자주 바뀐다면 2-1이 좋겠고,보완을 위한다면 2-2의 방법이 좋겠죠!!
하지만, C++로 DLL을 아무리 잘 만든다고 하더라도 COM이 지원 해주는 서비스를 따라갈 순 없습니다.
이것은 .NET 플밍을 하면서 직접 .NET 프레임웍을 만들겠다는 무모한 도전으로밖엔 보이지 않는군요.
몇몇 사람들은 COM을 만들어 사용하는 가장 큰 목적은 언어와 무관한 이진 레벨에서의 재활용이나 컴포넌트화라는 수준에서 말하는 분들도 계십니다. 하지만, 이런 것들이 프로그래머에게 와닿기에는 너무나 부족한 부분이 많습니다. 그냥 C++로 해진 님 말씀대로 dll을 잘~~~ 만들면 되니까요...
그럼 왜 COM을 해야 하는지 말씀을 드려보겠습니다.
가장 큰 이유는 DCOM이나 COM+같은 서비스를 사용하기 위해서입 니다.
클라이언트와 서버가 통신하기 위해 특정 사용자 프로토콜을 이 용해 서버에 작업을 요청하고 응답을 받고 하는 작업이 만만하 던가요?
클라이언트에서 서버의 함수를 바로 호출할 수 있다면 얼마나 편할지 생각해 보셨나요?
간단한 예로,
클라이언트와 원격지에 있는 서버와 통신하는 것을 비교해 보 죠.
클라이언트와 서버에서 TCP/IP로 소켓을 생성하고 연결합니다. 그리고 클라이언트는 특정 작업을 위해 메세지를 서버에게 보내 고 서버는 그 메세지를 받으면 A() 라는 함수를 호출하여 작업 을 처리하고 클라이언트에게 작업완료라는 메세지를 다시 보냅 니다. 그럼 클라이언트는 그 메세지에 따라서 다음 작업을 하거 나 잘못됐다면 다시 요청하는 엄청난 노가다를 해야 합니다.
하지만, COM에서는 원격지 서버의 A()를 직접 자신이 만든 함수 를 호출하듯이 A()를 호출합니다.
클라이언트에서는
if(서버인터페이스->A())
{
작업처리 완료이니 다음작업..
}
else
{
}
정말 간단하죠? 소켓을 만들필요도 없고 자신의 프로토콜을 만 들어 메세지를 주고 받을 필요도 없습니다. 그냥 바로 서버의 메서드를 호출하시면 됩니다. 그리고 수 많은 클라이언트가 동 시에 서버에 접근하는 처리방법등...
이것뿐만이 아닙니다. 최고급 프로그래머들이 코드레벨에서 엄 청난 시간을 투자하여 만들어야 하는 트랜젝션 처리는 어떻게 할까요?
그리고 동기화와 디버깅... 큐잉서비스... 이밖에도 보안 서비 스나 이벤트 서비스, 로드 벨런싱등등은... 생각만해도 끔찍하 기 짝이없는 많은 작업들이 이미 서비스 레벨에서(.NET 프레임 웍이 지원하는 것과 비슷한) 지원해준다는데 이걸 직접 만드시 겠다면...
글쎄요. 제생각은 평생해도 힘들듯 싶습니다....
너무 극단적인지는 몰라도, 이것이 실상입니다....
이정도면 COM 또는 .NET으로 짜야 할 이유는 충분하리라 생각됩 니다. 요즘 어플리케이션으로 돈버는 시대는 아니죠... 일반 데 스크탑에서 혼자 돌아가는 프로그램은 더이상 비전이 없어 보입 니다.
다시한번 COM을 되돌아 보시기 바랍니다. 아니면 .NET 을 보시 던가...그것도 아니면 일반 어플리케이션을 고집하시던가....
============================================================= //======================================================================================== // Visual C++코드 // Wrritten By BYUNG HO CHOI // Copyright 2008.9.22 // All rights reserved. // Version 1.0 //========================================================================================
//============================================================================== //---다른 Label 콘트롤(Threed32 Panel) Control 상속 얻기 -----------------------
BOOL CManualMotorPage::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class int ret; CLabelControl *plbl; if(pMsg->message == WM_LBUTTONDOWN){ for(int i=0;i<MAX_AXIS;i++){
/*------어레이 이벤트 발생 설정 ------------------------------------------*/ ..h protected: //}}AFX_MSG afx_msg void OnChangeTray(UINT nID); DECLARE_MESSAGE_MAP()
/*----------------------------------List Box Text 얻기----------------------------*/ //================================================================================= CString strTmp=""; int nListNo=m_ccName.GetCurSel();
//리스트 박스 만들기 RECT rect1={10,100,200,200}; m_pListBox.Create(WS_CHILD | WS_VISIBLE | LBS_STANDARD,rect1,this,200); m_pListBox.ShowWindow(SW_SHOW); //데이터 삽입 m_pListBox.AddString("data1"); m_pListBox.AddString("data2"); m_pListBox.AddString("data3");
//에디터 박스 만들기 RECT rect2={210,10,400,100}; m_pEditBox.Create( WS_CHILD | WS_VISIBLE | ES_MULTILINE //여러 라인 입력 | ES_AUTOHSCROLL | ES_AUTOVSCROLL| //자동 수직,수평 스크롤 WS_BORDER |WS_VSCROLL,//외곽선과 수직 수크롤바 설정 rect2,this,300); m_pEditBox.ShowWindow(SW_SHOW);
//콤보박스 만들기 RECT rect3={210,200,400,300};//콤보박스 출력 위치 //윈도우 만들기 m_pComboBox.Create(WS_CHILD | WS_VISIBLE|CBS_DROPDOWN ,rect3,this,400); m_pComboBox.ShowWindow(SW_SHOW); //콤보박스에 데이터를 넣는다. m_pComboBox.AddString("cdata1"); m_pComboBox.AddString("cdata2"); m_pComboBox.AddString("cdata3");
/*----------------------------------콘트롤 보이기 숨기기--------------------------*/ m_TestButton.ShowWindow(SW_HIDE);//(FALSE) m_TestButton.ShowWindow(SW_SHOW);//(TRUE)
UpdateData(FALSE); /*----------------콘트롤에서 직접 text 얻기----------------------------------*/ GetDlgItemText(IDC_SELECT_NAME_SCHOOL_YEAR1, csName); SetDlgItemText(IDC_PAGEMODEL, strText);
CPaintDC dc(this); // device context for painting int width=m_CamRect.right; int height=m_CamRect.bottom; // TODO: Add your message handler code here CPaintDC dcView(GetDlgItem(IDC_IMG_HISTO_VIEW));
// Center It UINT left = (clientRect.Width() - m_width) / 2; UINT top = (clientRect.Height() - m_height) / 2;
// a 24-bit DIB is DWORD-aligned, vertically flipped and // has Red and Blue bytes swapped. we already did the // RGB->BGR and the flip when we read the images, now do // the DWORD-align
//--------------------------------------------- theDC->SetStretchBltMode(STRETCH_DELETESCANS); //--------------------------------------------- // now blast it to the CDC passed in. // lines returns the number of lines actually displayed
BOOL CCommtestApp::InitInstance() { // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need.
#ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif
// Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; } /*----------------------------------------------------------------------------------*/ MainFrame *pFrame=(CMainFrame*)AfxGetMainWnd(); CChildFrame *pChild=(CChildFrame*)pFrame->GetActiveFrame(); CWinColorDoc *pDoc=(CWinColorDoc*)pChild->GetActiveDocument(); CWinColorView *pView=(CWinColorView*)pChild->GetActiveView(); /*-------------- View 에서 App 얻기------------------------------------------------*/
CSECKLineDVM2App* pApp = (CSECKLineDVM2App*)AfxGetApp(); pApp->SetSerialInfo();
/*----------------------전체 화면 출력 위치조정------------------------------*/ cs.x=200; cs.y=200; cs.cx=400; cs.cy=400;
/*----------------------다일로그 디스플레이 위치 변경------------------------*/ CExpansionDlg1* g_pExpansion = NULL;
if(!g_pExpansion) { g_pExpansion = new CExpansionDlg1(this); g_pExpansion->MoveWindow(50,387,354,320,true);//x,y,with,high Invalidate(TRUE); }
/*------------------프로그램 종료--------------------------------------------*/ 윈도우 "x" 종료 (도큐먼트에 설정)
void CMainFrame::OnClose() { // TODO: Add your message handler code here and/or call default
if (MessageBox("프로그램을 종료 하시겠습니까? ", " 재고관리프로그램", /*MB_ICONQUESTION*/ MB_ICONSTOP | MB_OKCANCEL) == IDOK) { PostQuitMessage(0); CFrameWnd::OnClose(); } }
BOOL CScrubDoc::SaveModified() { // TODO: Add your specialized code here and/or call the base class if(AfxMessageBox("프로그램을 종료하시겠습니까?",MB_ICONQUESTION|MB_YESNO)==IDYES) { OnClose(); PostQuitMessage(0); //((CMainFrame*)AfxGetApp()->m_pMainWnd)->SendMessage(WM_CLOSE,0,0);
/*--------------------프린트다일로그 않보이고 바로 출력하기-------------------*/ BOOL CManagementView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation pInfo->m_bDirect=TRUE; return DoPreparePrinting(pInfo); } /*---------------------------다일로그 호출-----------------------------------*/ CMyGraphDemoDlg dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel }
/*--------------------------------------------------------------------------------------*/ ////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// - Windows 제 어 - //////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------------------------------------------------------*/
/*------Hot Key------------------------------------------------------------*/ //-------------------------------------------------------------------------- BOOL CBroadView::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message==MM_MCINOTIFY) { if (pMsg->wParam==MCI_NOTIFY_SUCCESSFUL) { StopWav(); } } if (pMsg->message==MY_MSG_FIRE_OFF) { FireOff(); } if (pMsg->message==WM_KEYDOWN) { if (GetAsyncKeyState(VK_F1)&0x8000) { if (GetAsyncKeyState(VK_F5)&0x8000) { if (GetAsyncKeyState(VK_F9)&0x8000) { if (m_SetupBtn.IsWindowVisible()==FALSE) { FuncBtnShow(SW_SHOW); } } } }
// 2007.2.15 if (GetAsyncKeyState(VK_F6)&0x8000){m_bPingViewChk=TRUE;Invalidate(FALSE);SetTimer(REDRAW_TIMER,2000,NULL);}//RedrawWindow();
/*-----------------------------------------------------------------------------------*/ /*-------------- 투명 다일로그-------------------------------------------------------*/ #define WS_EX_LAYERED 0x00080000 #define LWA_COLORKEY 1 // Use color as the transparency color. #define LWA_ALPHA 2 // Use bAlpha to determine the opacity of the layer
LONG CHDDINSPView::UDPOnReceive(UINT wParam, LONG lParam) { }
/*-----------------------------------------------------------------------------------*/ /*-------------- 스레드에서 변수 참조------------------------------------------------*/
CPoint *pt; for ( int i = 0; i < m_nRingNum ; i++)
{ int nAxisX = 0; int nAxisY = 0;
if( i == 0) { nAxisX = (int)( cos(360*(PI / 180)) * nHalf ); // X point nAxisY = (int)( sin(360*(PI / 180)) * nHalf ); // Y point } else
{ nAxisX = (int)( cos((m_nAngle*i)*(PI / 180)) * nHalf ); // X point nAxisY = (int)( sin((m_nAngle*i)*(PI / 180)) * nHalf ); // Y point } // 6. 구한 점 저장
pt[i].x = nAxisX; pt[i].y = nAxisY }
/*--------------------------------------------------------------------------------------*/ ////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// - 다른프로그램 실행 - ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------------------------------------------------------*/
if (filedlg.DoModal()==IDOK) { szFileDir=filedlg.GetPathName(); AfxMessageBox(szFileDir);//전체 화일+확장자까지 szFileName=filedlg.GetFileTitle(); AfxMessageBox(szFileName);//입력 화일명만 szFileName=filedlg.GetFileName(); AfxMessageBox(szFileName);//입력 화일과 확장자 까지
//화일명 뺀 화일 Dir int index1=0; int index2=0; int nMode=0; index1=szFileDir.GetLength(); index2=szFileName.GetLength(); csTmp=szFileDir.Mid(0,(index1-index2));
//======Center부터 검색 ====================================================================================== //===CenterSearch=========================== int x2=0, y2=0; int half_x=width/2; int half_y=height/2; float direct_y=-1; float direct_x=-1; int Cnt_y1=0;int Cnt_y2=0; int Cnt_x1=0;int Cnt_x2=0; //==========================================
//---------BMP File Save------------------------------------------------------------------------ //BMP File Save int ImageMaxNo=1; BITMAPINFOHEADER dibHi; BITMAPFILEHEADER dibHf;/// CClientDC pDC(this); int ADD1=0; int ADD2=0; int ADD3=0; int x=0; int y=0; int y2=0; int WidthLineSize=WIDTHBYTES(24*width); int WidthLineSize2=WIDTHBYTES(8*width); unsigned char *BmpOutImg=NULL; BmpOutImg = new unsigned char [(height*ImageMaxNo)*(width*24)*3];
BmpOutImg =buf;
for(y=0; y<height*ImageMaxNo; y++) //BMP 화일로 저장 하기위해 거꾸로 저장 { y2=((height*ImageMaxNo)-y);//-1 중요(최종 한줄 표현) for(x=0; x<width; x++) { ADD1=(y2*WidthLineSize)+(3*x)+2; ADD2=(y2*WidthLineSize)+(3*x)+1; ADD3=(y2*WidthLineSize)+(3*x)+0;
// SetDIBitsToDevice(pDC.GetSafeHdc(),0,0,width,height, // 0,0,0,height,m_ColorGetImg,(LPBITMAPINFO)&bmiHeader, DIB_RGB_COLORS); } // Do not call CDialog::OnPaint() for painting messages }
//----------------------------------------------------------------------------------------------------------------------- void DibDraw(CDC *pDC, int px, int py, int height, int width, BYTE *BufImg, int Bit) { int x,y; int y2=0; int nBit=0; nBit=Bit; int rwsize = WIDTHBYTES(nBit*width);//(((8*width)+31)/32*4); // 4바이트의 배수여야 함 BITMAPINFO *BmInfo; BmInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256*sizeof(RGBQUAD));
if ((*StepFunc_1[index])() == NG) // 실행 error이면 TaskStatus1.iError = TaskStatus1.iNum; // main분기 data else // 실행성공이면 TaskStatus1.iError = OK;
extern int iCall_LaserMeasure(void);
/*--------------------------------------------------------------------------------------*/ ////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////// - 문 자 - ///////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------------------------------------------------------*/
//8888888888888888888888888888888888888888888888888888888888888 //--------데이타 형 ----------------------------- short int, int -2(15) ~ 2(15)-1 -32768~32767
long int -2(31) ~ 2(31)-1 -2147483648 ~ 2147483647
unsigned short int 0 ~2(15)-1 0 ~ 65535 unsigned int
unsigned long int 0 ~2(32)-1 0 ~ 4294967295
float 10(-79) ~ 10(75)
char -128 ~ 127 unsigned char 0 ~ 255
double "%.1e" long int "%ld" //------------------------------------------------------ char 8 int 16 short 16 long 32 float 32 double 64 //----------------------------------------------------- UINT-unsigned int BYTE -unsigned char LPSTR -char (LPSTR) char* LPTSTR -unsigned short LPCTSTR -CString //-------------------------- BOOL A Boolean value. BSTR A 32-bit character pointer. BYTE An 8-bit integer that is not signed. COLORREF A 32-bit value used as a color value. DWORD A 32-bit unsigned integer or the address of a segment and its associated offset. LONG A 32-bit signed integer. LPARAM A 32-bit value passed as a parameter to a window procedure or callback function. LPCSTR A 32-bit pointer to a constant character string. LPSTR A 32-bit pointer to a character string. LPCTSTR A 32-bit pointer to a constant character string that is portable for Unicode and DBCS. LPTSTR A 32-bit pointer to a character string that is portable for Unicode and DBCS. LPVOID A 32-bit pointer to an unspecified type. LRESULT A 32-bit value returned from a window procedure or callback function UINT A 16-bit unsigned integer on Windows versions 3.0 and 3.1; a 32-bit unsigned integer on Win32. WNDPROC A 32-bit pointer to a window procedure. WORD A 16-bit unsigned integer. WPARAM A value passed as a parameter to a window procedure or callback function: 16 bits on Windows versions 3.0 and 3.1; 32 bits on Win32. Data types unique to the Microsoft Foundation Class Library include the following: POSITION A value used to denote the position of an element in a collection; used by MFC collection classes. LPCRECT A 32-bit pointer to a constant (nonmodifiable) RECT structure.
//====리스트 사용하기======================================================== typedef struct { CString MarkID; int MarkNo; int Registered; int iLight[3]; } MARKDATA_RECORD;
for (int col=0;col<w;col++) { long offset = col * 3; char pixel[3]; if (fread((void *)(pixel),1,3,fp)==3) { // we swap red and blue here *(outBuf + rowOffset + offset + 0)=pixel[2]; // r *(outBuf + rowOffset + offset + 1)=pixel[1]; // g *(outBuf + rowOffset + offset + 2)=pixel[0]; // b } }
int w; int h; *width=w; *height=h; return outBuf; }
BYTE m1,m2; long filesize; short res1,res2; long pixoff; long bmisize; long compression; unsigned long sizeimage; long xscale, yscale; long colors; long impcol;
BYTE *outBuf=NULL;
// for safety *width=0; *height=0;
// init m_errorText="OK"; m_bytesRead=0;
FILE *fp;
fp=fopen(fileName,"rb"); if (fp==NULL) { CString msg; msg="Can't open file for reading :\n"+fileName; m_errorText=msg; return NULL; } else { long rc; rc=fread((BYTE *)&(m1),1,1,fp); m_bytesRead+=1; if (rc==-1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((BYTE *)&(m2),1,1,fp); m_bytesRead+=1; if (rc==-1) m_errorText="Read Error!"; if ((m1!='B') || (m2!='M')) { m_errorText="Not a valid BMP File"; fclose(fp); return NULL; }
//////////////////////////////////////////////////////////////////////////// // // read a ton of header stuff
rc=fread((long *)&(filesize),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((int *)&(res1),2,1,fp); m_bytesRead+=2; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((int *)&(res2),2,1,fp); m_bytesRead+=2; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(pixoff),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(bmisize),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(inBM.bmWidth),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(inBM.bmHeight),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((int *)&(inBM.bmPlanes),2,1,fp); m_bytesRead+=2; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((int *)&(inBM.bmBitsPixel),2,1,fp); m_bytesRead+=2; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(compression),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(sizeimage),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(xscale),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(yscale),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(colors),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
rc=fread((long *)&(impcol),4,1,fp); m_bytesRead+=4; if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}
//////////////////////////////////////////////////////////////////////////// // i don't do RLE files
if (compression!=BI_RGB) { m_errorText="This is a compressed file."; fclose(fp); return NULL; }
switch (inBM.bmBitsPixel) { case 24: break; // read pallete case 1: case 4: case 8: colormap = new RGBQUAD[colors]; if (colormap==NULL) { fclose(fp); m_errorText="Out of memory"; return NULL; }
int i; for (i=0;i<colors;i++) { BYTE r,g,b, dummy;
outBuf=(BYTE *) new BYTE [bufsize]; if (outBuf==NULL) { m_errorText="Memory alloc Failed"; } else {
//////////////////////////////////////////////////////////////////////////// // read it
long row=0; long rowOffset=0;
// read rows in reverse order for (row=inBM.bmHeight-1;row>=0;row--) {
// which row are we working on? rowOffset=(long unsigned)row*row_size;
if (inBM.bmBitsPixel==24) {
for (int col=0;col<w;col++) { long offset = col * 3; char pixel[3];
if (fread((void *)(pixel),1,3,fp)==3) { // we swap red and blue here *(outBuf + rowOffset + offset + 0)=pixel[2]; // r *(outBuf + rowOffset + offset + 1)=pixel[1]; // g *(outBuf + rowOffset + offset + 2)=pixel[0]; // b }
// if we need another byte if (bit_count <= 0) { bit_count = 8; if (fread(&inbyte,1,1,fp)!=1) { m_errorText="Read Error"; delete [] outBuf; delete [] colormap; fclose(fp); return NULL; } m_bytesRead++; }
// keep track of where we are in the bytes bit_count -= inBM.bmBitsPixel; pix = ( inbyte >> bit_count) & mask;
// lookup the color from the colormap - stuff it in our buffer // swap red and blue *(outBuf + rowOffset + col * 3 + 2) = colormap[pix].rgbBlue; *(outBuf + rowOffset + col * 3 + 1) = colormap[pix].rgbGreen; *(outBuf + rowOffset + col * 3 + 0) = colormap[pix].rgbRed; }
// read DWORD padding while ((m_bytesRead-pixoff)&3) { char dummy; if (fread(&dummy,1,1,fp)!=1) { m_errorText="Read Error"; delete [] outBuf; if (colormap) delete [] colormap; fclose(fp); return NULL; } m_bytesRead++; } } }
BYTE * JpegFile::MakeDwordAlignedBuf(BYTE *dataBuf,UINT widthPix,UINT height, UINT *uiOutWidthBytes) { //////////////////////////////////////////////////////////// // what's going on here? this certainly means trouble if (dataBuf==NULL)return NULL;
//////////////////////////////////////////////////////////// // how big is the smallest DWORD-aligned buffer that we can use? UINT uiWidthBytes; uiWidthBytes = WIDTHBYTES(widthPix * 24);
//////////////////////////////////////////////////////////// // alloc and open our new buffer pNew=(BYTE *)new BYTE[dwNewsize]; if (pNew==NULL) { return NULL; }
while( token != NULL ) { //////*** While there are tokens in "string" sprintf(temp2,"%s",token); csGetData=temp2; ///////*** Get next token: token = strtok( NULL, seps ); }
// Look for license file in same directory as this DLL. TCHAR szPathName[_MAX_PATH]; ::GetModuleFileName(hInstance, szPathName, _MAX_PATH); LPTSTR pszFileName = _tcsrchr(szPathName, '\\') + 1; lstrcpy(pszFileName, pszLicFileName);
/*---------------------CString 한줄씩 얻기 ----------------------------------*/ //-----------------------------------------------------------------------------------
////////*** Establish string and get the first token: token = strtok( string, seps ); char temp2[20]; while( token != NULL ) { //////*** While there are tokens in "string" sprintf(temp2,"%s",token); AfxMessageBox(temp2); ///////*** Get next token: token = strtok( NULL, seps ); }
//------------------------------------------------------------------------------------------- int MaxRow = MAXRAW+1; int MaxCol = MAXCOL; CString cs=""; CString csTmp=""; int col=3;
if (!exist && (fp = fopen(filename,"rt")) != NULL) { while (!feof(fp)) { ReadData.Empty(); if ( fgets(str, 200, fp) != NULL) { // error Return NULL ReadData.Format("%s", str); length = ReadData.GetLength();
if(bFileCheck2==false)//처움에만 찾기 { index = ReadData.Find("#SETUP$"); if(index>=0){bFileCheck=true; index=0; } else{AfxMessageBox("Save Data Not Find!"); break;} }
////////*** Establish string and get the first token: token = strtok( string, seps ); char temp2[20]; while( token != NULL ) { //////*** While there are tokens in "string" sprintf(temp2,"%s",token); AfxMessageBox(temp2); ///////*** Get next token: token = strtok( NULL, seps ); } /*--------------------strlen--------------------------------*/ char temp2[20]; char buffer[61] = "How"; int len; len = strlen( buffer ); // sprintf(temp2,"%d",len); sprintf(temp2,"%s",buffer); AfxMessageBox(temp2); /*---------------------- int--------------------------------*/ int a=111; sprintf(temp,"%d",a);
/*------------문자 위치(길이) 결과 얻어내기------------------------------------*/
InString="12345678+000 END"; index = InString.Find("END");//END의 위치 값 0 ~ END 정수 값
csText.Format("%d",index); AfxMessageBox(csText);
index = InString.Find("+"); m_csTmpString=InString.Left(index+2);//index 위치+2 까지 문자 얻음 AfxMessageBox(m_csTmpString);
/*-----------지정 위치 문자 얻어 내기 --String.GetAt(n)--------------------------------------*/
int Length2 = NamBangDataBuf.GetLength(); for(int n = 0; n < Length2; n++) { buf2[n] = NamBangDataBuf.GetAt(n); } buf2[n] = '\0';
n 위치의 문자를 얻어냄 /*-------------------------------------------------------------- index = InString.Find("+");//15 while(index>=0) { m_csTmpString=InString.Left(index+2);//"+"위치 + 2 위치 문자얻음 "," 까지 InString =InString.Right(InString.GetLength()-index-2); //전체에서 LEFT뺀 나머지 문자 OneChar = m_csTmpString.GetAt(0); //0 index = m_csTmpString.Find("N"); //4
index = csData.Find(csFind);//MODEL_INFO length = csFind.GetLength();
csTmpData=csData.Right(csData.GetLength() - index - 1); index2 = csTmpData.Find(OneChar);//MODEL_INFO csTmp = csData.Mid(length+index,index2+1-length); // csData.Format("index=%d",index2); if((index < 0)||(index2 < 0)) return _T(""); else return csTmp; } //------------------------------------------------------------------------------------- char *token; char szBuf[1024]; char seps[] = "\\"; ////////*** Establish string and get the first token: CString InString="C:\\DMX\\Bmp\\Field_R.bmp"; sprintf(szBuf,InString);
CString csGetData=""; token = strtok(szBuf,seps);
char temp2[20]; int Index=0; while( token != NULL ) { //////*** While there are tokens in "string" sprintf(temp2,"%s",token); csGetData=temp2; ///////*** Get next token: token = strtok( NULL, seps ); }
/*-----------------------AscHextoAscDec----------------------------*/ int CFileTestView::AscHextoAscDec(char hexnum[]) { /* int dec; dec = (int)hex-48; if(dec>9) dec=dec-7; return dec; */ int i=0; int Num[4],Sum;
////////*** Establish string and get the first token: token = strtok( string, seps ); char temp2[20]; while( token != NULL ) { //////*** While there are tokens in "string" sprintf(temp2,"%s",token); AfxMessageBox(temp2); ///////*** Get next token: token = strtok( NULL, seps ); } /*--------------------strlen--------------------------------*/ char temp2[20]; char buffer[61] = "How"; int len; len = strlen( buffer ); // sprintf(temp2,"%d",len); sprintf(temp2,"%s",buffer); AfxMessageBox(temp2);
//---------------------------------------------------------------------------------------- //Image 수평 분할 display /* CClientDC pDC(this); int Add_x,Add_y=0; int DivisionRate= PaletteSize_y*5;
pDC.SetPixel((x+BMP_START_EDGE_X1)+Add_x,(y+BMP_START_EDGE_Y1)-Add_y,RGB(m_DisplayImg_A[(y*WidthLineSize)+(3*x)+2],m_DisplayImg_A[(y*WidthLineSize)+(3*x)+1],m_DisplayImg_A[(y*WidthLineSize)+(3*x)+0])); } } } //------------------------------------------------------------------------------------------------- */ /* //----------------------------------------------------------------------------------- //Binary File Save //---------------------------------------------- // R G B 3Byte를 2Byte로 변환 // 00000000 00000000 // 11111 R -5비트 32 256/8 // 111 111 G -6비트 64 256/4 // 11111 B -5비트 32 256/8 //---------------------------------------------- //(128x(96*ImageNo))*2 한 픽셀 표현 2바이트 ,이미지 저장할 파일 사이즈 int ImageFileSize=(PaletteSize_x*(PaletteSize_y*ImageMaxNo)*2);
//------------------------------------------------------------------- BOOL Ellipse(int x1, int y1, int x2, int y2);
//------------------------------------------------------------------- BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3); BOOL RoundRect(PCRECT lpRect, POINT point); When this member function executes, the rectangle is drawn from the (x1, y1) to the (x2, y2) points. The corners are rounded by an ellipse whose width would be x3 and the ellipse's height would be x3. //------------------------------------------------------------------- BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); BOOL Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd); The (x1, y1) point determines the upper-left corner of the rectangle in which the ellipse that represents the pie fits. The (x2, y2) point is the bottom-right corner of the rectangle. These two points can also be combined in a RECT or a CRect variable and passed as the lpRect value.
The (x3, y3) point, that can also supplied as a POINT or CPoint for lpStart argument, specifies the starting corner of the pie in a default counterclockwise direction.
The (x4, y4) point, or ptEnd argument, species the end point of the pie.
To complete the pie, a line is drawn from (x3, y3) to the center and from the center to the (x4, y4) points. //-------------------------------------------------------------------
To draw an arc, you can use the CDC::Arc() method whose syntax is:
BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); Besides the left (x1, y1) and the right (x2, y2) borders of the rectangle in which the arc would fit, an arc must specify where it starts and where it ends. These additional points are set as the (x3, y3) and (x4, y4) points of the figure. Based on this, the above arc can be illustrated as follows: //------------------------------------------------------------------- This method uses the same arguments as Arc(). The difference is that while Arc() starts drawing at (x3, y3), ArcTo() does not inherently control the drawing starting point. It refers to the current point, exactly like the LineTo() (and the PolylineTo()) method. Therefore, if you want to specify where the drawing should start, can call CDC::MoveTo() before ArcTo(). Here is an example:
//------------------------------------------------------------------------ You may wonder why the arc is drawn to the right side of a vertical line that would cross the center of the ellipse instead of the left. This is because the drawing of an arc is performed from right to left or from bottom to up, in the opposite direction of the clock. This is known as the counterclockwise direction. To control this orientation, the CDC class is equipped with the SetArcDirection() method. Its syntax is:
int SetArcDirection(int nArcDirection); This method specifies the direction the Arc() method should follow from the starting to the end points. The argument passed as nArcDirection controls this orientation. It can have the following values:
Value Orientation AD_CLOCKWISE The figure is drawn clockwise AD_COUNTERCLOCKWISE The figure is drawn counterclockwise
The default value of the direction is AD_COUNTERCLOCKWISE. Therefore, this would be used if you do not specify a direction. Here is an example that uses the same values as above with a different orientation:
pDC->Arc(20, 20, 226, 144, 202, 115, 105, 32); } //------------------------------------------------------------------------ You can (also) draw an arc using the CDC::AngleArc() method. Its syntax is:
BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle); This member function draws a line and an arc connected. The arc is based on a circle and not an ellipse. This implies that the arc fits inside a square and not a rectangle. The circle that would be the base of the arc is defined by its center located at C(x, y) with a radius of nRadius. The arc starts at an angle of fStartAngle. The angle is based on the x axis and must be positive. That is, it must range from 0° to 360°. If you want to specify an angle that is below the x axis, such as -15°, use 360º-15°=345°. The last argument, fSweepAngle, is the angular area covered by the arc.
The AngleArc() method does not control where it starts drawing. This means that it starts at the origin, unless a previous call to MoveTo() specified the beginning of the drawing.
int xStartPoint; int yStartPoint; COLORREF GrapeLineColor;
if(SetNo==0) { xStartPoint=32; yStartPoint=150; GrapeLineColor= RGB(0,250,250); } else if(SetNo==1) { xStartPoint=32; yStartPoint=350; GrapeLineColor= RGB(0,250,0); } else if(SetNo==2) { xStartPoint=32; yStartPoint=550; GrapeLineColor= RGB(0,0,250); } int xExpand=22;/*x시간확장 11 or 22*/ int yExpand=(40/2)+(40/2);/*y온도 범위확장 20 or 40*/ int xLimit=40;/*y_pixel 나누기 단위 20 or 40*/ int yLimit=40/2; /*x_pixel 나누기 단위* 20 or 40*/ int yTatalNo=200/2; /*100 or 200 select*/
int xwidth=960;/*480 or 960*/ int yhigh=200/2;/*100 or 200*/ int width=xwidth+xStartPoint+xExpand; //width,high int high=yhigh+yStartPoint+yExpand;