Kill-Programm für OS/2

Willemers Informatik-Ecke

Das Programm ist recht einfach um den Aufruf DosKillProcess herum gestrickt. Für Administrationszwecke ist es sehr nützlich. Man kann damit Programme über ihre Prozessnummer gewaltsam abschiessen. Dabei ist auch eine Verwendung der hexadezimalen Zahlen, wie sie pstat liefert möglich, indem man 0x voranstellt (0x12 = 18).

Diejenigen, die am Programm kill.exe (28 KB) mehr Interesse als am Listing haben, können es auch herunterladen.

#define INCL_DOSPROCESS
#include <os2.h>

#include <stdio.h>
#include <stdlib.h>

void Usage(void)
{
	puts("kill pid");
	exit(1);
}

int Digit(char Zeichen)
{
	if (Zeichen>='0' && Zeichen <='9')
		return (Zeichen - '0');
	if (Zeichen>='A' && Zeichen <='F')
		return (Zeichen - 'A' + 10);
	if (Zeichen>='a' && Zeichen <='f')
		return (Zeichen - 'a' +10);
	return -1;
}

long GetValue(char *Str)
{
long Wert = 0;
int Basis = 10;
int Ziffer;

	while (*Str==' ') Str++;
	if (*Str=='0') {
		Basis = 8;
		Str++;
		if (*Str=='x' || *Str=='X') {
			Basis = 16;
			Str++;
		}
	}
	Ziffer = Digit(*Str);
	while (Ziffer>=0) {
		Wert = Wert*Basis + Ziffer;
		if (Ziffer>=Basis) {
			puts("PID not consistent");
			exit(2);
		}
		Str++;
		Ziffer = Digit(*Str);
	}
	return Wert;
}

main(int argc, char **argv)
{
unsigned long ActionCode = DKP_PROCESS;
PID	ProcessID;
int RetValue;

	if (argc!=2) Usage();
	else {
		ProcessID = GetValue(argv[1]);
		RetValue = DosKillProcess(ActionCode, ProcessID);
		if (RetValue) {
			switch(RetValue) {
			case 13: // ERROR_INVALID_DATA:
				puts("invalid data");
				break;
			case 217: // ERROR_ZOMBIE_PROCESS:
				puts("process terminated, but parent still not notified");
				break;
			case 303: // ERROR_INVALID_PROCID:
				puts("no such process");
				break;
			case 305: //ERROR_NOT_DESCENDANT:
				puts("not descendant");
				break;
			default:
				puts("unexpected error");
			}
		}
	}
}

Homepage (C) Copyright 1999 Arnold Willemer