nkmmtyp_slow_20150524.c

プロトタイプ - kanata, 2015/05/24 13:40

ダウンロード (1.88 KB)

 
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <signal.h>
4
#include <string.h>
5
#include <unistd.h>
6
#include <fcntl.h>
7
#include <time.h>
8
#include <errno.h>
9
#include <sys/ptrace.h>
10
#include <sys/types.h>
11
#include <sys/stat.h>
12
#include <sys/wait.h>
13

    
14
pid_t signal_pid;
15

    
16
/* シグナルハンドラ */
17
void signal_handler(int signum, siginfo_t *info, void *ctx){
18
  ptrace(PTRACE_DETACH,signal_pid,NULL,NULL);
19
  exit(EXIT_SUCCESS);
20
}
21

    
22
int main( int argc ,char *argv[] )
23
{
24
  pid_t pid;
25
  int status;
26
  struct timespec interval;
27
  struct sigaction signal;
28

    
29

    
30
  /* 引数の取得 */
31
  if( argc < 3 ){
32
    printf("Usage:\n");
33
    printf("  # %s pid interval(nanosec)\n\n",argv[0]);
34
    exit(1);
35
  }
36
  pid = atoi(argv[1]);
37
  interval.tv_sec  = 0;
38
  interval.tv_nsec = atol(argv[2]);
39
  if( interval.tv_nsec == 0 ){
40
    printf("Usage:\n");
41
    printf("  # %s pid interval(nanosec)\n\n",argv[0]);
42
    exit(1);
43
  }
44

    
45
  /* シグナルハンドラ設定 */
46
  memcpy(&signal_pid,&pid,sizeof(pid_t));
47
  memset(&signal,0x00,sizeof(sigaction));
48
  signal.sa_sigaction = signal_handler;
49
  signal.sa_flags = SA_RESTART | SA_SIGINFO;
50

    
51
  if (sigaction(SIGINT, &signal, NULL) < 0) {
52
    fprintf(stderr,"Failed to sigaction\n");
53
    exit(2);
54
  }
55

    
56
  /* 対象プロセスのATTACH */
57
  if(ptrace(PTRACE_ATTACH,pid,NULL,NULL) != 0 ){
58
    fprintf(stderr,"Failed to attach (pid: %d)\n",pid);
59
    exit(1);
60
  }
61
  
62
  printf("Now to be slowing... If you will stop for slow, press Ctrl + c\n");
63
  while(1){
64
    if(waitpid(pid,&status,0) < 0 ){ /* ATTACH の完了を待つ */
65
      fprintf(stderr,"Failed to waitpid (pid: %d) %s\n",pid,strerror(errno));
66
      exit(1);
67
    }
68
    if(WIFEXITED(status))break;
69
    if(ptrace(PTRACE_SINGLESTEP,pid,0,NULL) != 0 ){
70
      fprintf(stderr,"Failed to single step (pid: %d) %s\n",pid,strerror(errno));
71
      exit(1);
72
    }
73
    nanosleep(&interval,NULL);
74
  }
75

    
76
  ptrace(PTRACE_DETACH,pid,NULL,NULL);
77
  return EXIT_SUCCESS;
78
}
クリップボードから画像を追加 (サイズの上限: 100 MB)