'Programming'에 해당되는 글 91건

  1. 2006.08.04 (초보) gtk 작성팁 10
  2. 2006.07.30 GTK_TEXT 에러..해결책 4
  3. 2006.07.24 KernelProgramming-printk 5
  4. 2006.07.21 Kernel Panic! 2
  5. 2006.07.18 소켓shutdown..DomainName<->IP

(초보) 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

Kernel Panic!

커널 컴파일...

한 7번만에 성공~

지금 새로 컴파일된 커널에서 글을 쓰고 있어요~~ 하하하~

2.6.17커널인데.. 뭐 Archlinux에선 원래 최신 버젼을 지원하지만..

커널 프로그래밍을 하는걸 계기로 한번 해봤습니다..

커널 플그래밍 책이 2.4버전이길래... 그거 컴파일하려고 했는데.. 실패해서.. 2.6.17을 컴파일하게 됬네요

뭐 결국 2.4버전은 아직 하진 못했지만요..(커널 버젼이 틀려서 그런지 방법이 좀 다른거 같군요)..

이번 컴파일할땐.. 모듈을 안넣고.. 모두 커널에다 넣어버려서 lsmod명령어를 쳐도 모듈이 하나도 안잡히는..

모듈안쓰고 죄다 커널에다 넣으니까는.. 따로 드라이버 깔아주고 설정하구 안해도 되니까 더 편한거 같은..

속도는.. 빨라저야 하는거 같은데.. 잘 모르겠어요.. 제가 게임같은걸 하는게 아니니..

커널 컴파일... 후기

커널 컴파일 하기전에.. 현재 컴퓨터의 자세한 사항을 먼저 조사해 주세요.. 정말 중요합니다..
ex>보드,CPU,사운드카드,랜카드...등.

Kernel Panic ?? 이라면.....

VFS어쩌구 하면서 grub설정 틀렸다고 바꿔라 이렇게 비슷하게 나왔던거 같은데..

뭐 결과적으론 root 파티션을 읽을수 없다~ 이러면서 패닉 걸려버리더라는...

아마.. 이거와 비슷할겁니다

VFS: Cannot open root device "hda2" or 03:05
Please append a correct "root=" boot option
<데뱐 유저~에서 참조>

make menuconfig 에서..
Device Driver-> ATA/ATAPI/MFM/RLL support->PCI IDE chipset support(체크후,컴터에 해당하는 장치가 있으면 체크하고  다음 없으면 끝 )->Generic PCI bus-master DMA support 에서 자신에가 맞는것 선택..

에.. 이게 제일 중요한거 였어요.. 이걸 체크 해주니깐 Kernel Panic 안걸렸습니다..

자아.. 인제 사운드 카드랑.. 랜카드를 인식시켜주면 됩니다..
랜카드 선택할때 주의점은... 만약 보드안에 랜카드가 내장되어 있다면.
그 내장된 보드를 선택하셔야 합니다

예를 들어서 nforce인데 Realtek이다 하면 Realtek을 선택하는게 아니라 nforce를 선택 해야 한다는 거
입니다..(역시 설명이 좀 이상함,,,)

사운드 카드를 인식시킬때는.. 커널 디폴트로 ALSA는 선택 되더군요.
(아마 menuconfig자체가..사용자의 컴터를 조사하고 디폴트 값은 만들어 주는거 같았어요)
거기서 OSS설정을 추가해주시는게 좋을겁니다..

이외에도.. 콘솔 그래픽 설정.. 무슨 장치 설정.. 엄청 많았습니다.. 저야 다 모르지만.. 아는것 필요한것만

체크하고 make로 컴파일 했습니다..

그다음엔 모듈을 먹여야 하는데..저는 모듈을 하나도 안뒀으니~ PASS~하고 그냥 /boot에 복사하고서

grub/menu.lst에서 그냥 커널 이미지만 추가해 뒀습니다~

PS:lsmod해서 아무것도 안뜨니까 .. 기분이 이상하네요 ㅋ..(저번엔 more써서 몇페이지 정도 였는데.)

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

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

소켓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 ··· 13 14 15 16 17 18 19 next