[리눅스 프로그래밍] 간단한 나만의 쉘(Shell) 만들기

작년에 리눅스 프로그래밍 과제로 만들었던던 간단한 쉘 입니다. 이름은 어찌 지어야 할지 몰라서 minish이라고 하였습니다. 몇가지의 간단한 기본 명령어를 구현하였으며 백그라운드 프로세스 실행 및 >, >>등의 리다이렉션과 파이프(|)를 구현 하였습니다. 환경 변수를 활용한 프롬프트의 모양 변경도 가능합니다. 최대한 심플하게 그리고 예외처리 없이(시간이 부족했었다곤…..ㅠㅠ) 제작 되었습니다.

사용자 삽입 이미지쉘의 기본적인 화면입니다. 심플 그 자체입니다.

사용자 삽입 이미지파일 복사 명령어인 cp명령어의 테스트 화면입니다.

사용자 삽입 이미지파일 삭제명령어인 rm의 실행 모습입니다.

사용자 삽입 이미지파일 이동 명령어인 mv입니다. 위에서는 파일 이름을 변경하는데 사용해보고 있습니다.

사용자 삽입 이미지디렉토리를 옮겨다니는 cd 명령어의 수행 모습입니다. 권한이 있다면 디렉토리를 이동해 다닐 수 있습니다.

사용자 삽입 이미지디렉토리 생성 명령어인 mkdir입니다. 디렉토리를 생성하고 들어가보는 것까지 해보았습니다.

사용자 삽입 이미지디렉토리 삭제 명령어인 rmdir의 실행 모습니다.

사용자 삽입 이미지리눅스에 기본적으로 있는 cat명령어이죠. 욕심을 가지고 만들다가 파일 리더 그이상의 기능을 구현하지 못하였습니다;; 원래는 표준입력을 받아서 파일을 생성할수 있어야 하는데 말이죠..ㅠㅠ

사용자 삽입 이미지쉘의 종료 명령어입니다.

사용자 삽입 이미지환경 명령어를 설정하는 모습니다. PS2에 일반적으로 쓰이는 형태의 프롬프트 모양을 입력해 두시면 그 쉘 모양대로 프롬프트가 뜨게 됩니다.

사용자 삽입 이미지파이프(|)를 사용하는 모습입니다. 이거 생각보다 구현하기가 까다롭습니다…ㅠㅠ

사용자 삽입 이미지리다이렉트의 생성&추가를 해보는 모습입니다. 표준입출력의 기본이죠.

사용자 삽입 이미지백그라운드 프로세스(&)를 실행하는 모습입니다. sleep명령어를 수행하면 그 시간만큼 쉘이 멈춰있게 되는데 바로 다른 명령어를 입력받는것을 볼 수 있습니다. 이거 구현을 조금 야매로 한 감이 있긴 한데 정상 동작을 하는 듯하면서도 아닌듯 하면서도;; 아하하…아무튼 그렇습니다.

만들었던 소스를 공개 합니다. 잘만들지는 않았지만 학습용으로는 좋을것이라 생각됩니다. 하지만 과제 제출용으로 쓰실려는 학생 여러분…처음부터 끝까지 혼자 능력으로 프로그래밍 잘 하는 사람은 없다고 봅니다. 하지만 이 자료를 받아서 노력하는데 보탬이 되는데 쓸 지언정…그대로 내진 마세요…예전에도 어떤 학생이 교수님한테 이 블로그를 걸렸다고 글을 내려달라는 요청을 받은적도 있는데;;ㅎㅎ 스스로 공부합시다.

참고로 안에 Makefile도 있으니 make로 돌려 컴파일 하여 사용하시면 됩니다.

1066519629.zip

[JOTM+Xapool] xapool 이용 시 Null Pointer Exception 문제 해결

사용자 삽입 이미지서로 다른 데이터 소스를 하나로 묶어 트랜젝션을 이용할 수 있게 해주는 멋진 라이브러리로 JOTM이라는 것이 있습니다.

보통은 JOTM + Xapool 조합으로 사용하게 됩니다. 하지만 사실 이 둘의 라이브러리는 시대에 많이 뒤떨어지는 것이 아닐까 하는 생각이 듭니다.

둘다 업데이트가 2년이 넘게 없어왔기 때문입니다. 이쯤 되면 이 오픈소스 프로젝트들은 사실상 더이상 이어지지 않는다고 봐도 되겠죠.

그 예로 Xapool의 마지막 stable 버젼인 1.5.0에는 치명적인 문제가 한가지 있습니다. 물론 1.6.0beta 버젼에서 해결은 되었긴 하지만 beta버젼보다는 안전한 stable버젼을 이용하고픈 마음이 들기 마련이죠.

[code]java.lang.NullPointerException


at org.enhydra.jdbc.pool.GenericPool.getFromPool(GenericPool.java:200)
at org.enhydra.jdbc.pool.GenericPool.checkOut(GenericPool.java:351)
at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:194)
at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:164)
at my.jotm.test.Client.getConnection(Client.java:63)


java.sql.SQLException: SQLException in StandardPoolDataSource:getConnection exception: java.sql.SQLException: SQLException in
StandardPoolDataSource:getConnection no connection available java.lang.NullPointerException


at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:213)


at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:164)[/code]
위의 에러 어떠십니까? 마음에 들어 보이십니까? 이와 같은 Null Pointer Exception 에러를 내뿜는 에러를 만날 수 있습니다.

위의 에러는 Xapool에서 내는 에러인데요. [이곳]에 관련 패치가 등록 되어있습니다.

1290343559.patch


이 패치의 내용은 다음과 같습니다. 커넥션을 얻어올때 특정한 상황에 따라 Null을 받아오게 되면 다음의 보관된 논리적인 커넥션을 얻어오도록 넘어가는 처리만 추가되었습니다.

[code]— xapool/org/enhydra/jdbc/pool/GenericPool.java-1.13 2005-06-14 21:57:10.756790600 -0500
+++ xapool/org/enhydra/jdbc/pool/GenericPool.java 2005-06-15 13:11:09.601072300 -0500
@@ -189,6 +189,12 @@
   
       o = (GenerationObject) e.nextElement();
       life = (Long) unlocked.get(o);
+      if (life == null) {
+   // Fix for #303462; note that this fixes the problem, but Enumeration’s on Hashtable’s
+   // are by definition somewhat unpredictable; a more robust fix may be in order
+   log.debug(“GenericPool:getFromPool fix for #303462 encountered”);
+   continue;
+      }
       unlocked.remove(o);
       // In any case the object will be removed.
       // Prevents others accessing the object while we are
[/code]
실제로 해당 패치를 적용한 후에는 관련 문제점이 발견되지 않았습니다. 혹시 귀찮으신 분들을 위해 패치된 버젼을 올려둡니다.
1000564104.jar