'Programming'에 해당되는 글 58건

  1. 2006.08.22 그냥 이것저것 잡설 8
  2. 2006.08.04 (초보) gtk 작성팁 10
  3. 2006.07.30 GTK_TEXT 에러..해결책 4
  4. 2006.07.24 KernelProgramming-printk 5
  5. 2006.07.18 소켓shutdown..DomainName<->IP

그냥 이것저것 잡설

방학동안 한일
리눅스 프로그래밍(유닉스 시스템 프로그래밍?)-터미널,시그널,프로세스....,(전에 삿던 그 뻘건책)
       |-소켓프로그래밍- 열혈강의..한 2/3정도만 함(물론 윈도우편 제외하고)
       |-GTK - 이름 무지긴 책 하나 도서관에서 빌려서 봄 필요한것만 찾아서 봄 1.2버전이라서 쫌 고생함
(MY-SQL,QT,DEVICE,는 건너뜀)

소켓프로그래밍이랑 ,GTK는 Beginning Linux Programming 에 포함되어 있는 내용이지만은 좀 더 해볼까 싶어서
책을 따로 구해서 해보았지만.. 아무 많이 도움 되지는 않는듯..
GTK 21일 완성인가 책이 있어서 빌릴려고 했으나.. 없다.. 그냥 하던대로 튜토리얼이나 보면서 할수 밖에.

오늘 학교에서
처음 수업을 했는데 컴퓨터 그래픽스라고 하길래 나는 무슨 그림판 같이 툴을 다루는거 하는줄 알았는데..
프로그래밍이더라는 ,C,언어랑,수학이랑을 잘해야 한다던데... C는 그렇다고 치고 수학이 문제.. 나는 수학 바닥인데(월등히? 노력 안하기 때문이겠지만은)
그 C+Math의 조합..그게 뭐냐면 바로 Open GL.. 나는 이름만 들어보았지 뭐하는 놈인지는 오늘 처음 알았다는....
(인터넷 찾아보니깐 다이렉트 X 와 쌍벽을 이루는 놈 같던데... 퀘이크 엔진도 이녀석으로 만들었다는거 같고..)
교수가 설명해주기를 API만 알면 쉽겠네요 하던데...
(그래서 후에 찾아봤는데 정말로 완전 함수 모음 밖에 안되? 보이는거 같았다 여기서 API는 물론 M$-田 를 말함)
함수만 쓰는거면 뭐... GTK랑 비슷하게 하면 되겠지라는 이상한 생각을 갖고 있다....... 아닐확률이 매우 높지만.
아. 그리고 리눅스에서도 Open GL프로그래밍이 가능한거 같다. 아님 말고 뭐.

애니.
블랙라군,을 봤는데 액션이 정말 시원했었다... 하지만 끝이 제대로 안나는 듯한 느낌  마무리라는게 없다..
현대 직장인의 마음?을 잘 나타낸 애니라고 할까..(회사한테 버림받은 아픔? 과 함께 어떤 모험을 떠나고 싶다는 그런 마음을 표출한?) 원피스에다가 현대+사실성 을 부여했다고 하면 적절한 표현일까.

이리야의 하늘 UFO의 여름 -감동적인면이 있긴하나.. 편수가 적어서 (6편) 가볍게 볼수가 있다 하지만 그것 때문에 스토리가 상당히 축약된거 같은 느낌(나의 모에케릭터? 주인공 동생이 별루 안나와...)
그리고 동아리 부장이 하는 일은 없는듯 하다... 대체 왜 나오는지 원.. 앞에나오고 중간에 나오고 뒤에 나오고 끝
애니의 배경은 전쟁을 치르고 있다는점과 남주인공과 여주인공의 탈출(가출.. 물론 남주인공이 여주인공을 군이라고 하는 마수 로 부터 구하기 위해.. 어찌보면 꼭 맞아 떨어지진 않지만) 그리고 여주인공이 "군의 무기" 라는 설정, 그 "무기"가 죽으면(또는 일을 하지 않으면) "우리도 멸망" 한다는 점도 같으며 공격의 무리들이 외계인이라는점도 같다... 그리고 둘다 학생이라는것(차이라면 중학생과 고등학생의 차이???) 이라는게 "최종병기 그녀"와 유사했다
그나마 좀 나은게 있다면 이리야쪽이 그나마 해피 엔딩이라는 걸까...

'Etc' 카테고리의 다른 글

쓰르라미 울 적에 ALL 클리어..  (2) 2006.08.31
마이너씨 -- 바탕화면  (6) 2006.08.31
마이너씨~ Vol2  (0) 2006.07.18
사야의 노래  (14) 2006.07.12
APL Story ---  (2) 2006.07.08

(초보) gtk 작성팁

#1 g_signal_connect 함수 인자 넘겨주기

#include<gtk/gtk.h>

struct testing
{
    int a;
    char b;
};
.......
int delete_event(GtkWidget *widget,struct testing *data)
{
        data->a=3;
       printf("%d\n",data->a);
        return (FALSE);
}

int main(int argc,char *argv[])
{
   struct testing abc;
   ..........
   g_signal_connect(GTK_OBJECT (window), "delete_event",GTK_SIGNAL_FUNC (delete_event),&abc);
   ..........
}

연걸함수쓸때..(g_signal_connect) 인자를 넘겨주는 부분이 한곳(제일 마지막 인자) 밖에 없어서
어쩔수 없이 전역 변수를 사용해서 하는 수밖에 없었는데.. 그놈 포럼에서 찾아보니까 해결방법 이 있었다

"구조체를 넘겨주라"...라는것 ... 그래서 위에처럼 하니까 간단하게 해결되었다.
(사실 이방법말고 딴 방법을 찾을려고도 했지만...)

#2 윈도우 종료 시키기

사실 이거하기전에 윈도우를 종료 시키는 함수가 있긴 했다
gtk_main_quit();
바로 이함수,,,

그런데 문제는 이함수를 자식윈도우(?)에서 Call하면은 제대로 작동을 하지 않는다는것이었다
(첫번째 클릭때에서는 명령어 무시 2번 클릭하면 프로그램 자체가 종료)
그래서 아래의 방법을 사용하기로했다(이거 찾는다고 꽤나 고생)

void closeWin(GtkWidget *window,GtkWidget *data)
{
  gtk_widget_hide_all(data);
}

이함수를 쓰니깐 잘 작동을 한다.. 헌데.. 뭔가 찜찜하다랄까...
hide라서.. remove나 quit같은게 아니라서 말이다
(어감이 좀.... 말끔하게 없어진다는 게 아니라서 말이죠)

이것말고 새로운 방법들이 있는지도 찾아봐야겠습니다....

.... 헉... 이걸로 하면 인제 부모윈도우가 꺼져도  프로그램이 종료가 안되는...
이 함수도 안되겠군요.;;

라고 해서... kldp+튜토리얼의 힘으로 대충 알아냈습니다..
void closeApp(GtkWidget *window,gpointer *data)
{
    gtk_main_quit();
}

void errorMsg(const char *errMsg,GtkWidget *window)
{
   GtkWidget *dialog;

dialog=gtk_message_dialog_new_with_markup(GTK_WINDOW(window),
GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,errMsg);

g_signal_connect (GTK_WINDOW(dialog),"response",GTK_SIGNAL_FUNC(gtk_widget_destroy),
GTK_OBJECT(dialog));

 
gtk_widget_show_all(dialog);

}

Ps:
gtk를 사용하여 프로그램 만들기...
그다지 어렵지 않은거 같군요.. 제가 대총하는거 보니..
아주 직관적으로 이루워져 있어서.. 함수 이름만 보고 확실히 무언 기능을
하는가 알수 있습니다 하지만 그 단점으로는 너무 함수명이 길어지고 언더바를 너무
써서 새끼손가락에 무리? 가 간다는거 정도...

할만 합니다....(취소) 하지만 너무 복잡하네요..우아아악~

자...여러분도... 한번 간단한 프로그램을 작성해보는것은 어떻습니까?

GTK+ Reference Manual(ENG) => http://developer.gnome.org/doc/API/2.0/gtk/index.html
GTK+ Tutorial(KOR)   =>      http://wiki.kldp.org/KoreanDoc//html/GtkTutorial/GtkTutorial.html#toc25

'Programming > GTK+' 카테고리의 다른 글

vte를 이용한 간단한 터미널  (2) 2007.01.14
libglade 컴파일법  (1) 2006.12.14
TODAY.... 삽질 DAY  (6) 2006.08.09
GTK_TEXT 에러..해결책  (4) 2006.07.30
Glade! 리눅스 GUI 프로그래밍 툴  (0) 2006.07.18

GTK_TEXT 에러..해결책

gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,"abc",3);
라고 했더니만

undefined reference to `GTK_TEXT' 라는 에러가 발생했다..
처음에는 오탈자인줄 알고서 몇번을 봤더만 틀린것이 없었다..

그래서 VI에서 자동완성 기능을 이용해서 저게 어느 헤더 파일에 포함됬는가 확인을 해봤는데.

/gtk/gtktext.h 라고 하길래  인클루드를 추가해 보았으나 소용이 없었다.

그래서 어쩔수 없이 구글링으로 써치 해서 자료를 찾았다..

찾은곳은 그놈 개발 메일링 리스트 같았다..

다행이 쉬운영어?라 대충 뭐라 하는지 이해하고.. 믿에 쭉.. 읽어보니깐 해결책이 나왔다
#define GTK_ENABLE_BROKEN
#include <gtk/gtk.h>

으로 해서 gtk.h파일 위에 define해주면 되는거 였다..

'Programming > GTK+' 카테고리의 다른 글

vte를 이용한 간단한 터미널  (2) 2007.01.14
libglade 컴파일법  (1) 2006.12.14
TODAY.... 삽질 DAY  (6) 2006.08.09
(초보) gtk 작성팁  (10) 2006.08.04
Glade! 리눅스 GUI 프로그래밍 툴  (0) 2006.07.18

KernelProgramming-printk

커널의 나만의 함수를 시스템 콜(함수)로 만들어보기

1시스템 콜을 등록하자

리눅스 커널 2.4버전이 /usr/src/linux-2.4.32 의 디렉토리에 있다고 하면

/usr/src/linux-2.4.32/include/asm-i386/unistd.h
파일에서 내가 만들 함수를 추가한다

#define __NR_exit_group 252
아래에 추가할것(커널 2.4 일때)
만약 거기에 글자가 있더라도 수정해도 된다
(라인수가 맞게 작성하자 예를들어서 252밑 라인에)

ex>
#define __NR_cpuinfo 253

다음에는
/usr/src/linux-2.4.32/arch/i386/kernel/entry.S 파일에 역시 전거와 비슷하게
라인수를 맞춰서 적는다

ex>
.long SYMBOL_NAME(sys_cpuinfo)
참고로 라인수는 위쪽라인에 옆 주석에 대충 5인가 10사이마다 나와있다
그것을 잘 맞춰서 할것(앞에서 253이었다면 이번에도 253 맞춰서 적어주어야함)

Plus...C에서는 인수가 6개 정도 밖에 안된다고 한다나

2함수가 될 본제를 작성한다

/usr/src/linux-2.4.32/kernel/cpuinfo.c(편의상 kenel 디렉토리에 작성)

#include<linux/linkage.h>
#include<linux/unistd.h>

asmlinkage int sys_cpuinfo()
{
   printk("CPU INFO\n");//C에서 printf 함수와 사용법이 비슷하다
   return 0;
}

3/usr/src/linux-2.4.32/kernel/Makefile 에다가 오브젝트?를 추가해준다
obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \
         module.o exit.o itmer.o info.o time.o softirq.o resource.o
         중략....
         signal.o sys.o kmod.o ......(맨뒤에다가)  cpuinfo.o 추가(아마도 c파일이랑 같은 파일명으로 해야하는거 같다)

4 unistd.h 파일을 복사해 준다

cp /usr/src/linux-2.4.32/include/asm-i386/unistd.h /usr/include/asm/unistd.h

5 시스템 콜을 이용할 프로그램을 작성한다

#include<linux/unistd.h>
_syscall0(int,cpuinfo);

main()
{
  int i;
  i=cpuinfo();
}

6 컴파일
7 출력이 되지 않으면 로그 파일을 확인해본다
ex>/var/log/message.log



쏫스의 자세한 내용은 본인도 모름... 니마~ 이 라인 어떻게 되는거삼~ 하고 물으면 본인은 좌절할수 밖에 없음.;
예>main함수가 왜 저따위로 생겼삼? 이런거.. 내용은..C언어 안다면 대충 무슨짓하는지는 알수 있을듯

'Programming > Kernel' 카테고리의 다른 글

확실히 다르잖아!!  (4) 2008.04.15
ctags 설정  (4) 2008.03.11
본체 전원키로 시스템 off 시키기  (4) 2007.04.22
운영체제 없이 화면에 A를 찍어보아요...  (6) 2007.04.06
Kernel Panic!  (2) 2006.07.21

소켓shutdown..DomainName<->IP

여태까지 우리는 소켓을 보낼때 close함수로 소켓을 닫았습니다

하지만 이럴때에 만약 한쪽에서 보낸 데이터를 보냈는데 받는측에서는 벌써 close함수가 호출되

어서 Pipe 가 (올바른 표현인가는 모르겠습니다만)  닫혀버린다면... 보낸 그 데이터는 유령 데

이터가 되어 버리겠죠..

음 자세히 설명하자면...


A------------------------------------>B
A<------------------------------------B
상황에서

A--------------data-------X------>B(close run)
A<------------------------X----------B
이런 상태가 되면 난감하니까..(close 함수로 끝내면 다 닫혀 버림..)


A----X--------------data--------->B
A<---------data--------------------B
바로 전달하고 막아버림

아 몰라... 일단 반씩 소켓을 닫는 함수를 소개하자면..

int shutdown(int sockfd,int how);
이 함수는 무쟈게~ 간단합니다...
자꾸 파이프가 생각나네요 흠..
뭐 암튼... 인자는

sockfd:............소켓 fd
how:012가 있습니다.. 각 순서는 stdin,stdout을 생각해보시면 잘 알수 있으실겝니다..

라고 해도 설명을 해야겠죠 흠..
0:입력스트림 종료 1:출력스트립 종료 2:둘다 종료
0:SHUT_RD 1:SHUT_WR 2:SHUT_RDWR 이렇게 쓰기도 합니다..
이것들은 open함수에서써먹었던 놈들이 생각나네요.. 끝부분이 비슷하죠......;;;;;;;;;;;;

도메인 이름을 -> IP 로 IP를 ->도메인 네임으로!!
새로운 구조체 등장!

#include<netdb.h>

struct hostent{
   char h_name;
   char **h_aliases;
   char h_length;
   char **h_addr_list;
}

h_name:딱 보면 나오지않는가! 바로 공식 호스트 네임 ex>www.naver.com
h_aliases:더블포인터..이라하면 여러개를 가르키는.. 그리고 이름을 보자 alias...
떠오르는게 없을려나! 바로..비슷한 이름을 치면 공식 호스트 네임의 서버로 들어가는것
설명이 더 힘들다 간단한 ex>www.naver.co.kr,  naver.com
h_addrtype: ipv4(걍 여태까진 ip4라고 했죠? 귀찮아서 축약)ip6인지 알아낼수 있습니다
h_length:주소의 길이,위의 값에 따라 달라진다 버전4==4 버전6==16
h_addr_list:넣은 도메인 이름의 IP 큰회사일경우 IP가 여러개 찍힐수 있다(서버 갯수가 많으므로)그것때문에 2차원 포인터.

이 구조체로 써먹을수 있는 함수들은..

1.도메인이름으로  IP주소와 그에 따른 정보 알아보기
struct hostent* gethostbyname(const char * name);
성공시 hostent구조체 반환,즉 이 함수가 성공하면 걍 구조체안의 변수들을 출력하기만
하면 호스트의 정보를 볼수 있다
인자는 볼것도 없다.. 그냥 따옴포 치고 넣어주던가 아님 argv로 받아서 넘겨주면 끝

2.아까꺼랑 반대로 .. IP로 도메인 이름 알아보기
struct hostent* gethostbyaddr(const char *addr,int len,int type);
addr:(char *)&addr.sin_addr 을 넣어주면 된다..
(뭐 당연히 addr은 구조체를 뭘 했냐에 따라서 다르다)
len:ipv4==4 ipv6==16을 넣어준다
type:말 그대로 타입..AF_INET,AFINET6 를 선택해서 집어넣는다(각 ipv4 ipv6)

**혹시 해서 적는데.. 포인터로 받으니까.. 에러시 리턴값은 NULL이다
prev 1 ··· 8 9 10 11 12 next