디바이스 드라이버에서 특정 프로세스에게 주기적인 signal을 보내려고 함니다.

 

근데 시그널 핸들러를 몇번 수행 하다가 시스템이 죽는 현상이 발생합니다. ㅠ

 

제가 초보라 무엇이 문제인지 잘 모르겠습니다 .

 

고수님들의 많은 조언 부탁드립니다 .

아래는 소스코드입니다.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 디바이스 드라이버

시그널을 보내기위해서 해당 프로세스의 정보를 가지고 오려는 ioctl 입니다.
int ioctltest_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) {
 
 ioctl_test_info ctrl_info;
 int size;
 size = _IOC_SIZE( cmd );
 printk("size %dn", size);
 switch(cmd) {
 
  case IOCTLTEST_WRITE :
   copy_from_user ( (void *) &ctrl_info,  (const void *) arg, size );
   user_pid = (pid_t  *)ctrl_info.size;
   printk("user pid number %dn", user_pid);
   
   user_struct = find_task_by_pid(user_pid);
   printk("OKn");
   check_number =1;
  
  break;
  }

 return 0;
}

struct file_operations ioctltest_fops = {

 .owner = THIS_MODULE,
 .ioctl = ioctltest_ioctl,
 .open = ioctltest_open,
 .release = ioctltest_release,

};

 

......................................

// 여기서 해당 프로세스에게 시그널을 보냅니다.

static int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
 if (check_number == 1 )
 {
  force_sig(SIGUSR1, user_struct);
  //send_sig_info(SIGUSR2,(struct siginfo *)1 ,user_struct);
  }
 else
 {
  printk(" signal send not user process n");
 }

 return 0;

}

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////시그널을 받을 유저 프로세스

 

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <linux/sched.h>
#include "test.h"
#include <signal.h>
#define name "/dev/test"
struct task_struct *task;
int a =1;

 

void test_handler() ////////////////////////////////시그널 핸들러

  printf(" %dn", a++);

}


int main()
{
 int fd;
 int ret,i;
 ioctl_test_info info;
 struct task_struct *p;

 

 fd = open(name,O_RDWR|O_NDELAY);
 signal(SIGUSR1, (void *)test_handler); ////////////////// 시그널 핸들러 등록
 printf("fd : %dn", fd);

 info.size = getpid();
 printf(" pid %d n", info.size);

 ioctl(fd, IOCTLTEST_WRITE , &info.size);
 printf( " signal ok %dn", i); 

 while (1){
  
  }

 close(fd);
return 0;
}

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22269
418 커널 스터디에 관해서;;. 질문드립니다. [5] 한상은 2007.07.11 8693
417 컴파일러 최적화 부분에서... [2] 김국진이 2010.09.04 8666
416 리눅스에서 FIQ 사용 하는법 아시나요? 홍문화 2010.06.11 8656
» signal에 대한 질문입니다 많은 조언 부탁드립니다 ㅠㅠ [19] 송창인 2011.04.06 8597
414 arm 보드 구매에 대한 조언 부탁 드립니다. [1] 김성준 2007.10.27 8581
413 HP-UX 링크 옵션 질문입니다. [6] 조운현 2011.04.06 8575
412 sk_buff 을 이용한 UDP 패킷 전송 질문있습니다ㅠㅠ [1] 김숙현 2012.10.05 8556
411 리눅스의 스케쥴링에 따른 priority는 어떻게 설정해주나요? [5] 심우진 2011.04.12 8539
410 스터디 참여에 관해서 질문이있습니다. [1] 최대진 2007.09.12 8530
409 defconfig,Kconfig... ?? [1] 서보일 2012.07.26 8510
408 사운드 드라이버 관련 질문입니다. [2] 조현호 2013.03.25 8479
407 trap_init() 설명 부탁드려요~ [3] 이창만 2008.11.18 8433
406 라이브러리 프로파일링 [2] 김경태 2011.01.12 8431
405 리눅스 커널패닉 덤프를 분석하려면 필요한 선수지식 [4] 아척 2013.07.31 8427
404 LINUX ARM switch_mm 관련해서 문의 드립니다. [20] 송원식 2011.08.12 8381
403 C 개발 표준 [2] 조운현 2011.06.01 8373
402 커널 모듈에서 특정 사용자 프로세스의 메모리 공간을 접근하고 싶습니다. [3] 남현우 2009.04.01 8326
401 qemu에서 커널을 debugging 하고 싶습니다. [4] 하이디제이 2012.05.07 8287
400 모집 공고 보고 참석 메일 보냈는데요. [1] 문경원 2007.10.17 8273
399 page table 질문 [3] 김광식 2012.08.21 8267
XE Login