dbkill.cpp
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: dbkill.cpp,v 11.4 2000/05/02 17:08:31 dda Exp $
  8.  */
  9. /*
  10.  * Kill -
  11.  * Simulate Unix kill on Windows/NT and Windows/9X.
  12.  * This good enough to support the Berkeley DB test suite,
  13.  * but may be missing some favorite features.
  14.  *
  15.  * Would have used MKS kill, but it didn't seem to work well
  16.  * on Win/9X.  Cygnus kill works within the Gnu/Cygnus environment
  17.  * (where processes are given small pids, with presumably a translation
  18.  * table between small pids and actual process handles), but our test
  19.  * environment, via Tcl, does not use the Cygnus environment.
  20.  *
  21.  * Compile this and install it as c:/tools/kill.exe (or as indicated
  22.  * by build_win32/include.tcl ).
  23.  */
  24. #include <windows.h>
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <limits.h>
  28. /*
  29.  * Like atol, with specified base.  Would use stdlib, but
  30.  * strtol("0xFFFF1234", NULL, 16) returns 0x7FFFFFFF and
  31.  * strtol("4294712487", NULL, 16) returns 0x7FFFFFFF w/ VC++
  32.  */
  33. long
  34. myatol(char *s, int base)
  35. {
  36. long result = 0;
  37. char ch;
  38. int sign = 1;  /* + */
  39. if (base == 0)
  40. base = 10;
  41. if (base != 10 && base != 16)
  42. return LONG_MAX;
  43. while ((ch = *s++) != '') {
  44. if (ch == '-') {
  45. sign = -sign;
  46. }
  47. else if (ch >= '0' && ch <= '9') {
  48. result = result * base + (ch - '0');
  49. }
  50. else if (ch == 'x' || ch == 'X') {
  51. /* Allow leading 0x..., and switch to base 16 */
  52. base = 16;
  53. }
  54. else if (base == 16 && ch >= 'a' && ch <= 'f') {
  55. result = result * base + (ch - 'a' + 10);
  56. }
  57. else if (base == 16 && ch >= 'A' && ch <= 'F') {
  58. result = result * base + (ch - 'A' + 10);
  59. }
  60. else {
  61. if (sign > 1)
  62. return LONG_MAX;
  63. else
  64. return LONG_MIN;
  65. }
  66. }
  67. return sign * result;
  68. }
  69. void
  70. usage_exit()
  71. {
  72. fprintf(stderr, "Usage: kill [ -sig ] pidn");
  73. fprintf(stderr, "       for win32, sig must be or 0, 15 (TERM)n");
  74. exit(1);
  75. }
  76. int
  77. main(int argc, char **argv)
  78. {
  79. HANDLE hProcess ;
  80. DWORD accessflag;
  81. long pid;
  82. int sig = 15;
  83. if (argc > 2) {
  84. if (argv[1][0] != '-')
  85. usage_exit();
  86. if (strcmp(argv[1], "-TERM") == 0)
  87. sig = 15;
  88. else {
  89. /* currently sig is more or less ignored,
  90.  * we only care if it is zero or not
  91.  */
  92. sig = atoi(&argv[1][1]);
  93. if (sig < 0)
  94. usage_exit();
  95. }
  96. argc--;
  97. argv++;
  98. }
  99. if (argc < 2)
  100. usage_exit();
  101. pid = myatol(argv[1], 10);
  102. /*printf("pid = %ld (0x%lx) (command line %s)n", pid, pid, argv[1]);*/
  103. if (pid == LONG_MAX || pid == LONG_MIN)
  104. usage_exit();
  105. if (sig == 0)
  106. accessflag = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ;
  107. else
  108. accessflag = STANDARD_RIGHTS_REQUIRED | PROCESS_TERMINATE;
  109. hProcess = OpenProcess(accessflag, FALSE, pid);
  110. if (hProcess == NULL) {
  111. fprintf(stderr, "dbkill: %s: no such processn", argv[1]);
  112. exit(1);
  113. }
  114. if (sig == 0)
  115. exit(0);
  116. if (!TerminateProcess(hProcess, 99)) {
  117. DWORD err = GetLastError();
  118. fprintf(stderr,
  119.     "dbkill: cannot kill process: error %d (0x%lx)n", err, err);
  120. exit(1);
  121. }
  122. return 0;
  123. }