Operacni System TUOX dokumentace:


V adresari "old" je "process.c" kde jsou provedeny zmeny oproti puvodnimu z "kernel.zip". Byla zde pridana pid_t getppid() jelikoz zde nebyla:
pid_t getppid(void)
{
m.m_type = C_GETPID;
send_recv(MM,m);
if (m.MM_ERRORNO != 0)
return m.MM_ERRORNO; /* vracime chybovy kod */
return m.MM_GPPID; /* vracime pid rodice volajiciho procesu */
}

byla udelana podobne jako funkce getpid().
Byly zmeneny funkce wait() a waitpid(), tak aby byli volany stejne jako v linuxu.
pid_t wait(int *__status)
{
m.m_type = C_WAITPID;
m.MM_WAITFOR = -1;
m.MM_WAITOPT = 0;//WNOHANG;
send_recv(MM,m);
if (m.MM_ERRORNO != 0)
return m.MM_ERRORNO; /* vracime chybovy kod */
*__status=m.MM_EXITVALUE;
return m.MM_EXITEDPID; /* vracime pid procesu, ktery skoncil */
}
a
pid_t waitpid(pid_t __pid, int *__status, int __options)
{
m.m_type = C_WAITPID;
m.MM_WAITFOR = __pid; /* pid na koho cekat */
m.MM_WAITOPT = __options; /* pripadne dalsi nastaveni */
send_recv(MM,m);
if (m.MM_ERRORNO != 0)
return m.MM_ERRORNO; /* vracime chybovy kod */
*__status=m.MM_EXITVALUE;
return m.MM_EXITEDPID; /* ??? mozno vracet jeste exitstatus, a terminate status */
}

Zmeny v souboru "process.c" z adresare "new" oproti souboru "process.c" z adresare "old".Byla zde pridana tabulka, ve ktere se budou uchovavat pro signaly, nami udelana obsluzna rutina {ukazatel na ni}.
static sighandler_t signal_tab[NR_SIGS]; //#j&j#
Definovany funkce registSignalHandler(), ktery slouzi pro to, aby rekl MM kam ma posilat vsechny signaly {obslouzeni signalu}, pokud je chce uzivatel zpracovavat.
void cdecl (* cdecl registSignalHandler(int __sig, void cdecl (* func)())) (int)
{
m.MM_PTRFUNC = func;
m.m_type = C_SIGNAL;
m.MM_SIGNAL = __sig;
send_recv(MM,m);
if (m.MM_ERRORNO != 0)
return (void cdecl (*)())m.MM_ERRORNO; /* pripadny chybovy kod */
return (void cdecl (*)())0;
}
a funkce signalHanlderInLib(), ktera provadi pro dany signal spusti obsluznou rutinu { v tabulce "signal_tab" jsou ukazatene na tyto obsluzne rutiny}
void signalHandlerInLib(int __sigNo) {
asm {
push ax
push bx
push cx
push dx
push si
push di
}
signal_tab[__sigNo](__sigNo); /* *** */
asm {
pop di
pop si
pop dx
pop cx
pop bx
pop ax
add sp,4 /* si,di */
pop bp
add sp,4 /* za fiktivni navratovou adresu (near) a signal# */
iret
}
}
Proto byla zmenena i funkce signal()
void cdecl (* cdecl signal(int __sig, void cdecl (* func)())) (int)
{
void cdecl (* f)();
m.m_type = C_SIGNAL;
m.MM_SIGNAL = __sig; /* cislo signalu */
if((__sig>=0)&&(__sig<=NR_SIGS)) {
if (func == SIG_IGN) {
m.MM_PTRFUNC = SIG_IGN; /* nastavit signal IGNORE */
m.MM_SIGNAL=__sig;
m.MM_SETFLAG=1;
send_recv(MM,m);
return (void cdecl (*)()) m.MM_ERRORNO; /* vracime pripadny chybovy kod */
}
/* sig_dfl */
if (func == SIG_DFL) {
m.MM_PTRFUNC = SIG_DFL;
m.MM_SIGNAL=__sig;
m.MM_SETFLAG=1;
send_recv(MM,m);
return (void cdecl (*)()) m.MM_ERRORNO;
}
if(func != (void cdecl (*)())NULL) {
f=signal_tab[__sig];
signal_tab[__sig]=func; /* ulozeni ukazatele rutiny do tabulky */
m.MM_PTRFUNC = SIG_IGN;
m.MM_SIGNAL=__sig;
m.MM_SETFLAG=0;
send_recv(MM,m);
m.MM_PTRFUNC = SIG_DFL;
m.MM_SIGNAL=__sig;
m.MM_SETFLAG=0;
send_recv(MM,m);
return f;
}
/* vracime pripadny chybovy kod */
} else return SIG_ERR;
return SIG_ERR; /* nemelo by se stat */
}
Dale byli zmeneny soubory mm\signal.c, konkretne funkce do_signal().
PUBLIC int do_signal() /*PUBLIC*/
{
unsigned short int Maska=1;
// if (mp->mp_func==SIG_DFL) { ?
if (mm_in.MM_PTRFUNC==SIG_DFL) {
if (mm_in.MM_SIGNAL > 16 || mm_in.MM_SIGNAL < 1) { return (int) SIG_ERR; }
if (mm_in.MM_SIGNAL != SIGKILL) {
Maska<<= mm_in.MM_SIGNAL-1;
if (mm_in.MM_SETFLAG)
(mp->mp_catch) &= (~Maska);
else mp->mp_catch |= Maska;
return (int) SIG_DFL;
} else return (int) SIG_ERR;
// } else if (mp->mp_func==SIG_IGN) { ?
} else if (mm_in.MM_PTRFUNC==SIG_IGN) {
if (mm_in.MM_SIGNAL > 16 || mm_in.MM_SIGNAL < 1) { return (int) SIG_ERR; }
if (mm_in.MM_SIGNAL != SIGKILL) {
Maska<<= mm_in.MM_SIGNAL-1;
if (mm_in.MM_SETFLAG)
(mp->mp_ignore) |= Maska
else mp->mp_ignore &= (~Maska);
return (int) SIG_IGN;
} else return (int) SIG_ERR;
} else {
mp->mp_func= mm_in.MM_PTRFUNC;
return OK;
}
}
A do souboru mm\mm.h byl pridan jeden radek.
#define MM_SETFLAG m6_i2
Slouzi proto, abychom mohli pokud uz nechceme mit vlastni obsluhu signalu, tak ji nastavime na jedna.
Naslo se par chyb:
1. v souboru common\signal.h meli dva signaly stejne cislo, opravena verze je k dispozici na webu.
2. v souboru mm\getset.c ve funkci FindIndex(), opravena verze je k dispozici na webu.
Byly prepsany testovaci programy "testxx.c" kde xx je 65.67.68,69,70,71,72 a 73. Byli udelane testovaci programy "testxx.c" kde xx je 76,77 a 78. Dopsany byli jeste testovaci programy "test74l.c" a "test75l.c", ktere jsou psany pod linuxem.