[업무일지]-20100906-임종현
inittab
inittab을 설정하기위해서 위와같이 입력하면 다음창이뜬다.
다음은 vi편집기로 열었을때 이다.
inttab파일의 런레벨을 설정하여 사용할수 있다.
위 파일의 각 필드는 콜론(:)으로 구분한다.
첫번째 필드는 임의의 식별자로 어떤 것이든 상관없으며 파일 내에서 다른 것과 총돌하지 않으면 된다.
둘째 필드는 명령이 실행될 실행 레벨이다.
셋째 필드는 init이 그 항목을 어떻게 처리할 것인지 지시한다.
넷째 필드는 init이 실제 실행할 명령이다.
id : 2 : initdefault -> 디폴티 run level 2로 설정
si : : sysinit : /etc/init.d/rcS -> 시스템을 부팅할 때 init에게 /etc/init.d/rcS을 실행 하도록 한다. 이 파일은 기본 시스템 초기화를 처리해주는 명령을 담은 간단한 셸 스크립트다. 예를 들면, 스와핑 긴능을 켜고 파일시스템을 점검하고, 마운트하며, 시스템 시간을 CMOS 시간에 맞춘다.
10 : 0 : wait : /etc/init.d/rc 0
11 : 1 : wait : /etc/init.d/rc 1
12 : 2 : wait : /etc/init.d/rc 2
13 : 3 : wait : /etc/init.d/rc 3
14 : 4 : wait : /etc/init.d/rc 4
15 : 5 : wait : /etc/init.d/rc 5
16 : 6 : wait : /etc/init.d/rc 6
-> 실행 레벨 0부터 6까지, 어디로 들어가든 /etc/init.d/rc 스크립트에 적절한 실행 레벨 인수를 사용하여 실행한다. rc는 다목적 시동 스크립트로서, 각 실행 레벨에 알맞은 스크립트를 실행시켜 준다. 여기서 action 필드는 wait다. init에게 주어진 command를 실행하고, 종료할 때까지 기다린 후 다음 작업으로 넘어가라는 지시다.
-> 각 실행 레벨의 스크립트는 (데비안의 경우) /etc/rcN.d에 있다. 여기서 N은 시작할 실행 레벨 번호다. 따라서 실행 레벨 2라면 /etc/rc2.d의 스크립트를 사용한다. 이 디렉토리들의 내용을 살펴 보면 Snnxxxx나 Knnxxxx 형태의 파일을 볼 수 있는데 K로 시작하는 서비스를 죽이는 스크립트이며, S로 시작하는 스크립트는 서비스를 시작할 때 사용하는 스크립트다. 이름에 들어 있는 nn은 서로의 실행 순서를 맞추려는 것으로 낮은 번호의 스크립트는 높은 번호의 스크립트보다 먼저 실행된다.
-> 같은 서비스를 서로 다른 실행 레벨에서 시작하고 중지하기 때문에 같은 스크립트를 여러 곳에 복사하는 것보다 심볼릭 링크를 사용하고 있다. 따라서 각각의 S, K 파일은 모든 서비스의 시동/셧다운 스크립트를 포함한 중앙 디렉토리를 가리키는 심볼릭 링크일 뿐이다. 데비안의 경우 이 중앙 디렉토리는 /etc/init.d 이다. 그러므로 특정 서비스를 시동 시키거나 중지시키고 싶을 때는 /etc/init.d에 위치한 스크립트를 이용하면 쉽게 할 수 있다.
/etc/init.d/networking stop : 네트워크 서비스 중단
/etc/init.d/networking start : 네트워크 서비스 시작
또 다른 중요 시스템 설정 스크립트는 /etc/init.d/rc.local이 있다. 이 스크립트는 다른 시스템 초기화 스크립트를 실행한 뒤에 실행된다. (보통 각각의 /etc/rcN.d에 S99rc.local이라는 심볼릭 링크를 만들어 둔다. 99라는 숫자는 s 스크립트가 가질 수 있는 가장 큰 숫자이므로 가장 나중에 실행된다) 부팅 중 다른 특별한 시스템 명령을 실행하길 원하거나 어디에서 실행시켜야 할지 모를 때는 rc.local 파일을 편집하여 사용하면 된다.
ca : 12345 : ctrlaltdel : /sbin/shutdown -t1 -a -r now
-> 이 항목은 콘솔에서 Ctrl-Alt-Del 을 눌렀을 때 실행된다. 이 키조합을 누르면 보통 시스템은 재부팅하는 인터럽트가 발생한다. 리눅스에서는 이 인터럽트를 받아 init에게 보내고 init은 ctrlaltdel의 action 필드에 있는 항목을 실행한다. 여기서는 /sbin/shutdown -t1 -a -r now로 안전한 시스템 재부팅을 진행시킨다.
1: 2345 : respawn : /sbin/getty 38400 tty1
2: 23 : respawn : /sbin/getty 38400 tty2
3: 23 : respawn : /sbin/getty 38400 tty3
4: 23 : respawn : /sbin/getty 38400 tty4
5: 23 : respawn : /sbin/getty 38400 tty5
6: 23 : respawn : /sbin/getty 38400 tty6
-> 마지막으로 inittab 파일에는 처음 나오는 6개의 가상 콘솔을 /sbin/getty에서 실행하는 항목이 있다. 이 프로그램은 터미널의 로그인을 받아준다. 이 프로그램이 없다면 터미널은 그야말로 죽은 상태나 다름없으며 키보드나 마우스에 반응하지 않는다. getty 명령은 터미널 장치를 열고 터미널 드라이버에 다양한 매개변수를 설정하고 /bin/login을 실행하여 로그인 세션을 연다.
-> getty는 '보율(baud rate)'과 '장치'라는 두 개의 인수를 받는다. 리눅스 가상 콘솔의 포트명은 /dev/tty1, /dev/tty2등이다. 가상 콘솔의 보율은 일반적으로 38400이다.
-> getty 항목의 action 필드는 respawn인데 이는 해당 명령이 죽으면 init이 다시 명령을 실행한다는 뜻으며, 사용자가 로그아웃 할 때마다 getty 프로세스가 죽으며 이에 따라 getty 프로세스를 다시 실행시켜 로그인을 준비한다.
프린트 포트-
|
|
|
|
|
|
1.
[] No 항목은 DB25 커넥터의 핀 번호이고, 36핀 항목은 프린터 케이블에
달린 센트로닉스 36핀 커넥터의 핀 번호이다.
예를 들면 DB25 커넥터의 15번 핀은 센트로닉스 커넥터의 32번 핀에
연결 되었다는 뜻.
[] 논리 항목에 "R" 표시된 핀은 레지스터의 비트와 커넥터 핀의 신호가 반대로
되는데, 예를들어 1번 핀은 레지스터 비트가 "1"일때 커넥터핀은 "0"이 된다.
[] 신호방향은 핀의 신호가 PC에서 나가는 신호면 "OUT", 들어오는 신호면
"IN"으로 표시한다.
[] 데이터,상태, 제어 항목은 각각 어느 핀이 어느 레지스터의 어느 비트에
연결되어 있는가를 나타낸다. 예를 들면:
2번 핀은 DATA 레지스터의 0번 비트에 연결되어 있다; 그래서 PC에서
DATA 레지스터의 BIT 0를 1로 하면 2번 핀에 전압이 나타나고, 0으로 하면
꺼진다. (출력 핀에 나타나는 전압은 약 5볼트이다:TTL레벨)
표에 나와있지 않은 비트들은 사용되지 않는 비트들로 보통 1로 세트되어 있다.
[] 각 레지스터의 주소는 프린터 포트마다 다르다.
LPT1의 베이스 포트 주소는 PC의 BIOS 영역 40:08에, LPT2의 주소는 40:0A에
1워드(2바이트)로 저장되어 있어 이곳을 읽으면 베이스주소를 알수있다.
단, 베이스 주소가 0이거나 3FFh 이상이면 프린터포트가 설치되어있지 않은 것이다.
[] 데이터(DATA) 레지스터의 주소는 베이스 포트 주소와 같고,
상태(Status) 레지스터의 주소는 베이스 주소에 1을 더한 주소이며,
제어(Control) 레지스터의 주소는 베이스 주소에 2를 더한 주소이다.
LPT 번호 |
BIOS영역의 주소위치 |
레지스터 주소 |
|
|
|
|
데이터 |
상태 |
제어 |
LPT1: |
40h:08h |
(40h:08h) |
(40h:08h) + 1 |
(40h:08h) + 2 |
LPT2: |
40h:0Ah |
(40h:0Ah) |
(40h:0Ah) + 1 |
(40h:0Ah) + 2 |
LPT3: |
40h:0Ch |
(40h:0Ch) |
(40h:0Ch) + 1 |
(40h:0Ch) + 2 |
2.
*1 PC에서 프린터 인터럽트를 활성화 시키면, 이 핀을 0으로 할 때 마다
PC 내부의 IRQ 인터럽트 루틴이 실행된다.
** 인터럽트는 하강엣지에서 걸리지만 비트 자체의 논리는 부논리가 아닌 정논리이다.
*2 이 핀의 신호가 0이면 프린터가 리셋된다.
*3 이 접지 핀들은 원래 프린터로 연결될 때 핀 2 - 9 번의 Data 핀들과
하나씩 꼬여서 연결되는 것이다(Twisted fair)
일반적으로 이들중 하나만 접지로 연결해도 상관 없다.
*4 특수기능 BIT는 프린터포트의 외부로 연결된 핀이 없지만 내부에서
특별한 기능을 가진다.
. IRQ enable을 세트시키면 프린터 IRQ가 활성화 된다. 즉 ACK 신호가
들어올 때마다 IRQ 인터럽트 루틴이 실행된다. 그러나 실제 IRQ를
정말 활성화 시키려면 PC 내의 다른 레지스터도 함께 조작해야 한다,
. Extended mode가 되면 프린터포트의 데이터 레지스터에서 8 비트의
데이터를 입력받을 수 있게 된다; 즉 출력 전용이던 데이터 레지스터가
입력 전용이 된다.(단, 프린터포트가 이것을 지원 해야 함)
3.
[] 커넥터 핀 번호와 배치도
아래그림의 배치도는 숫컷 커넥터를 핀 면에서 본 것이다.
핀번호는 왼쪽에서 오른쪽으로 매겨지는데, 암컷 커넥터일 경우는
핀 번호가 반대로 오른쪽에서 왼쪽으로 가면서 매겨진다.
즉, 좌우가 바뀌는 것이다.
또한, 핀이 꽂혀있는 플라스틱 면을 잘 보면 각각 핀 번호가 새겨져
있는것이 보인다.
병렬포트 통신.
man page-
open의 메뉴얼을 보여준다.("man 2 open")
병렬포트 통신을 위한 저수준 입출력 소스C코드.
IDev에 있는 값을 읽거나 쓰거나 할 수 있다.
명일 - 저수준 입출력, 리눅스 명령어 , vi사용법
JAVA-
이벤트처리의 다양한 예를 모아서 짜 본것이다.
=========================================================
package JFrameXX;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
class JFrameEx extends JFrame implements ActionListener, KeyListener{
JButton jb = new JButton("추가");
JButton a = new JButton("끝");
Panel b = new Panel();
JTextField tf = new JTextField();
public JFrameEx(){
jb.setToolTipText("추가버튼입니당");
a.setToolTipText("종료버튼입니당");
jb.addActionListener(this);
a.addActionListener(this);
tf.addKeyListener(this);
b.add(jb, BorderLayout.WEST);
b.add(a, BorderLayout.EAST);
add(tf, BorderLayout.SOUTH);
add(b, BorderLayout.NORTH);
setBounds(500,500, 500, 500);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == jb){
int result = JOptionPane.showConfirmDialog(jb, "추가할래?");
if(result == 0){
jb.setText("추가완료");
jb.setEnabled(false);
}
}
if(e.getSource() == a){
System.exit(EXIT_ON_CLOSE);
}
}
@Override
public void keyPressed(KeyEvent e1) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e1) {
// TODO Auto-generated method stub
String str[] = {"ㅋㅋㅋㅋ"};
if(e1.getSource()==tf){
if(tf.getText().equals(str[0])){
jb.setEnabled(true);
}
}
}
@Override
public void keyTyped(KeyEvent e1) {
if(e1.getSource()==tf){
JTextField tmp = (JTextField)e1.getSource();
setTitle(tmp.getText());
}
}
}
public class JFrameX {
public static void main(String[] args) {
new JFrameEx();
}
}
=========================================================
실행결과이다.
일단 추가를 하게되면 추가할지 다시 되물어보는 창이 생성되고
글자를 적게되면 위의 텍스트필드에 문자의 글자를 보여준다.
그리고 Tooltip을 이용하여 버튼에마우스를 가져갔을때 힌트를 보여준다.
추가를 하고나면 버튼창이 비활성화되는데 다시 활성화시키는 치트를 만들어 놓았다.