A VM (és azon belül a CMS) egy kifejezetten interaktív használatra kifejlasztett operációs rendszer. Alaphelyzetben csak interaktív módon tudunk programokat fejleszteni és futtatni. Természetesen kötegelt feldolgozásra is van lehetőség, ehhez azonban vagy a CMSBATCH, vagy a VMBATCH (vagy más) alrendszerek valamelyikét kell használni.
A VM számára egy könnyen elsajátítható, ám igen sok utasítást és paramétert tartalmazó parancsnyelven lehet megfogalmazni a munkát. Ez a parancsnyelv CP, CMS és XEDIT parancsokból áll.
A CP parancsok hatásköre csak a virtuális hardver konfigurációra terjed ki. A programjaink tényleges futtatását CMS paranccsal kezdeményezhetjük.
cmscmd param1 param2 ... ( opt1 opt2
ACcess vdev fm (opts
ACcess (NOPROF
Az első formát az SFS használata esetén adhatjuk ki egy directory elérésére.
A második formát a minidiszkek elérésére használhatjuk, míg a harmadikat IPL CMS után, ha nem akarjuk a PROFILE EXEC-et végrehajtani.
COMPARE fid1 fid2
Ezzel a paranccsal két file-t hasonlíthatunk össze.
CONWAIT
Ez a parancs addig várakozik, míg az összes várakozó üzenet ki nem került a konzolra.
COPYfile fid1 fid2 (opts
File-ok másolására szolgál. A leggyakrabban használt opciói:
PACK/UNPack Tömörít/visszaalakít
OLDDate A régi dátumot hagyja meg
REPlace Felülírja a létező file-t is.
DISK DUMP fid
Ezzel a paranccsal kivihetünk egy CMS file-t a SPOOL-ba. Ez a parancs bármilyen CMS file-t képes kezelni.
DISK LOAD
Ez a parancs betölti az RDR-ünkön lévő DISK DUMP formátumú file-t az "A" lemezünkre. A file azonosítóját a spool file-ból veszi.
ERASE fid
Ezzel törölhetünk ki egy CMS file-t. A kitörölt file véglegesen elveszik!
EXECIO lines DISKR fid [lnum] ([opt1] [opt2]
DISKW fid [lnum] [recfm lrecl] ([opt1] [opt3]
CP ([opt2] [opt4] [opt3]
Ezt a parancsot csak REXX-ből (EXEC2-ből) használhatjuk, mégpedig CMS file-ok beolvasására és kiirására. A művelet vagy a stack-ból/ba, vagy egy REXX változóból/ba megy végbe. Az EXECIO-nak a fentieken kívül még igen sok paramétere van, de ezzel itt nem foglalkozunk. A fenti paraméterek jelentése:
DISKR Beolvasás
DISKW Kiírás
CP CP parancsot adunk ki.
lines A művelet által beolvasott/kiírt sorok száma.
fid fn ft fm
lnum Egy sor száma a file-ban, itt keződik a művelet.
recfm Rekordformátum (F, V)
lrecl Rekordhossz
opt1 FINIS A file lezárását kérjük.
opt2 STEm v. Egy REXX törzsváltozót definiál. Kiíráskor ebből a változóból (indexelve v.1, v.2,...) iródik ki a file, míg beolvasásnál ebbe kerül bele. A beolvasott sorok száma ekkor a v.0 összetett változóba kerül
opt3 STring string A kiírandó sort tartalmazza. CP paraméter esetén a CP parancsot. Amennyiben az ST paramétert használjuk, akkor annak az utolsónak kell lennie a sorban.
opt4 BUFfer bytes A CP output puffer méretét definiálja byte-okban. Akkor kell megadni, ha a CP parancs eredménye igen hosszú, pl. az egész spool tartalomjegyzékét lekérdezzük, stb. Alapértelmezés: 4096.
FILEList [fid]
Full-screen tartalomjegyzéket ad. A file azonosító (fid) tartalmazhat * karaktereket is.
FORMAT vaddr fm ([BLK nnnK]|[LABEL]
Megformáz egy minidiszket. "LABEL" megadása esetén csak a diszk cimkéjét írja át, de nem törli a tartalmát.
vaddr A minidiszk virtuális címe.
fm File mód.
BLK nnnK 1K, 2K, 4K: a diszk blokkméretét adhatjuk meg.
GLOBAL TXTLIB textlibs
MACLIB maclibs
LOADLIB loadlibs
Ezzel a paranccsal különböző könyvtárakat jelölhetünk ki. A kijelölt könyvtárak elérhetővé válnak a fordítóprogramok vagy a betöltőprogram számára.
Help compname
Kiírja a megadott parancs használati módját.
Listfile [fid] [(EXEC [ARGS]]
Kilistázza a terminálra vagy a CMS EXEC nevű fileÄba (EXEC megadása esetén) a fid-nek megfelelő nevű file-ok neveit (azaz a minidiszk tartalomjegyzékét). Ha nem adjuk meg a fid paramétert, akkor az "A" diszk tartalomjegyzékét listázza. A fid paraméter * -okat is tartalmazhat. A CMS EXEC file a következőképpen néz ki:
&1 &2 fn ft fm
Ha megadjuk az ARGS paramétert is:
&1 &2 fn ft fm &3 &4 &5 &6...
LOAD fn [START]
Betölti a fn TEXT nevű file-t a tárba, és a START megadása esetén el is indítja azt. A betöltéskor megpróbálja feloldani az összes külső hivatkozást. A feloldást a tárból, vagy másik TEXT file-ból, vagy a GLOBAL TXTLIB-el definiált könyvtárból végzi.
PEEK [spid] [(FOR nnn]
Ezzel a paranccsal meg lehet nézni egy RDR spool file tartalmát anélkül, hogy a file kitörlődne a spool-bol.
Alapértelmezés szerint csak az első 200 sort lehet vele megnézni. Ha ez nem elég, akkor adjuk meg a FOR paramétert. nnn helyére kell írni a sorok számát, vagy *-ot, ha az egész file-t meg akarjuk tekinteni.
PUNCH fid [(NOH]
PRINT fid
E parancsokkal egy CMS file-t (fid) tudunk elküldeni a virtuális lyukasztóra, vagy nyomtatóra. Ha megadjuk a NOH paramétert a PUNCH-nál, akkor csak a file tartalma kerül ki a lyukasztóra, ha nem adjuk meg, akkor még egy fejléc is.
RECEIVE [spid]
Ezzel egy másik felhasználó (vagy saját magunk) által hozzánk küldött CMS file-okat. A CMS file-nak a RDRÄünkön kell lennie.
Rename fid1 fid2
Ezzel a paranccsal átnezvezheünk egy CMS file-t más névre.
SENDFile fid [TO] uid [AT node]
SF
Elküldi a fid azonosítójú file-t az uid virtuális gép RDR-ére (a spool-ba). Az uid-nak nem kell ugyanebben a rendszerben lennie (node).
Példa: Hogyan készítsünk el és futtassunk le egy programot CMS-ben?
1. A forrásnyelvű programot az XEDIT editorral készithetjük el. Ajánlatos a file típusát a használt programozási nyelvnek megfelelően választani. Pl.: FORTRAN, ASSEMBLE, PLIOPT, PASCAL, ADA, stb.
2. Az elkészült programot a megfelelő fordítóprogrammal lefordítjuk. Pl.: FORTVS2 fn ( OPT(3)
3. Ha a forditóprogram lefordította a forrásprogramot, akkor ki kell jelölni a szerkesztő/betöltő által használt könyvtárakat. Ezt a GLOBAL paranccsal tehetjük meg:
GLOBAL TXTLIB VSF2FORT VSF2MATH stb.
GLOBAL LOADLIB VSF2LOAD stb.
4. Ezután definiáljuk a futtáshoz használt file-okat:
FILEDEF ddnév definíció
5. Ekkor betölthetjük és elindíthatjuk a programot:
LOAD fn (START
A fenti procedurát gyorsíthatjuk, ha készítünk hozzá egy kis REXX programot. Ez pl. az alábbi lehet:
/* fordit, futtat */ arg fn '(' fdefs /* fdefs: pl. 06=term,05=disk fn ft fm */ 'FORTVS2' fn '( OPT(3)' if rc<>0 then exit rc 'GLOBAL TXTLIB VSF2FORT VSF2MATH' 'GLOBAL LOADLIB VSF2LOAD' do while fdefs^='' parse value fdefs with fileid '=' filedef ',' fdefs 'FILEDEF' fileid filedef if rc<>0 then exit rc end 'LOAD' fn '(START'
A CMS 6.0 -ban lehetséges a felhasználói file-ok ún. osztott használata. Ezt a Shared File System valósítja meg. A felhasználó adatai ilyenkor egy vagy több ún. file pool-ban helyezkednek el. A file pool-ban az adatokhoz ugyanazon információk tartoznak, mint a minidiszkeken lévőkhöz.
A file-ok elhelyezése directory struktúrában valósul meg. A felhasználó által használható file pool nevét a rendszeradminisztrátor határozza meg.
Egy adott felhasználó fő directory-jának a neve megegyezik a felhasználó VM azonosítójával.
A file pool használatát a
SET FILEPOOL vmsysu:
utasítással kell elkezdeni. A "vmsysu" egy előre definiált file pool név. Amennyiben a rendszeradminisztrátor nem ebbe a file pool-ba definiált minket, akkor kérdezzük meg, hogy mi annak a neve. A file pool nevének ismerete nélkül nem tudjuk a SFS-et használni. A definiált alkönyvtárakat a DIRLIST paranccsal tudjuk kilistázni. Formája:
DIRLIST [dirid]
Ahol a "dirid" a megtekintendő könyvtár neve. Alapértelmezése: USERID.
A rendszeradminisztrátor kijelölheti, hogy mely felhasználó kapjon minidiszket, és/vagy file pool területet. Ha a felhasználónak nincs minidiszkje, akkor az alábbi műveletet nem kell elvégeznie, mert a rendszer hozzárendeli az "A" filemódot az adott felhasználó fő directory-jához.
A használni kívánt directory-t ("könyvtárat") az ACCESS paranccsal kell használhatóvá tenni. Pl. rendeljük hozzá a "C" azonosítót a fő directoryÄhoz:
ACCess userid. C
vagy:
ACCess . C
A "userid" alapértelmezés, ezért nem kell kiírni. Ezután már ugyanúgy használhatjuk a "C" filemód-al definiált területet, mintha egy minidiszk lenne az.
A felhasználó definiálhat alkönyvtárakat is, maximálisan 8 szintig egymásba ágyazva. Ezzel a módszerrel egy igen változatos faszerkezetet lehet létrehozni. Az alkönyvtárakat a
CREate DIRectory dirnév
paranccsal hozhatjuk létre.
Például hozzunk létre két aldirectory-t: CREate DIRectory .PROBA
CREate DIRectory .PROBA.MASIK
Az eredményt a: DIRList paranccsal nézhetjük meg.
A DIRLIST parancson belül további parancsokat adhatunk ki, melyek az adott alkönyvtárra vonatkoznak. Használható parancsok:
ACCESS - az adott directory elérésére
ERASE - az adott directory letörlésére (A fő directory-t nem lehet törölni!)
RELEASE - az ACCESS megszüntetése
RENAME - directory átnevezése
Például: Az előző DIRLIST-ben adjuk ki a CMD mező alatti második sorban, hogy:
ACCESS / B
Ügyeljünk arra, hogy a / jel előtt is, és után is legyen egy szóköz! Ha ezután kilépünk a DIRLIST-ből (F3), akkor átmásolhatunk az új filemódra néhány file-t. Pl:
COPY FILELIST * S = = B
Az access-ált filemódokat a
Query ACCESSED
paranccsal tudjuk lekérdezni. E parancs megadja, hogy a file módok melyik minidiszkhez vagy alkönyvtárhoz vannak hozzárendelve.
Bármelyik könyvtár vagy az abban lévő file-ok használhatóak osztott módon. Ez azt jelenti, hogy egyidejűleg több felhasználó tudja a file-t olvasni, vagy automatikusan felváltva írni, és több felhasználó tud egyszerre ugyanabba a directory-ba irni. Ezeket a funkciókat minidiszkkel nem lehet elérni.
E funkciókhoz a tulajdonosnak engedélyezni kell az adott directory vagy file használatát. Ezt a következőképpen teheti meg.
Directory engedélyezés:
GRAnt AUThority dirid TO userid (newauth
File engedélyezés:
GRAnt AUThority fn ft dirid TO userid (newauth
A "fn" és az "ft" helyére a kívánt file neve és típusa kerül.
A "dirid" helyére a directory azonosítóját kell írni, amelyikben a file található.
A "userid" jelzi azon virtuális gép azonosítóját, aki az engedélyt kapja. Ha a "userid" helyére PUBLIC-ot írunk, akkor az engedély minden felhasználóra vonatkozik.
Az "auth" értéke kétfére lehet:
READ - a file/directory csak olvasható
WRITE - a file/directory írható/olvasható.
Egy adott file használatához az azt tartalmazó directory használatát is engedélyezni kell. A WRITE authority a directory esetén azt jelenti, hogy a felhasználó új file-okat is létrehozhat, vagy törölhet/átnevezhet file-okat a directoryban.
A megnevezett user az engedélyét tovább nem adhatja.
A tulajdonos az engedélyt bármikor visszaveheti a következő paranccsal:
REVoke AUThority dirid FROM userid
REVoke AUThority fn ft dirid FROM userid
Magyarázat: U.az, mint a GRANT parancsnál.
Példa: A VMSYS:MAINT.SAMPLES directory-ra a következő parancsokat adta ki a rendszer az installálásnál:
GRANT AUTHORITY VMSYS:MAINT.SAMPLES TO PUBLIC (READ
GRANT AUTHORITY * * VMSYS:MAINT.SAMPLES TO PUBLIC (READ
Így tehát kiadhatjuk a következő parancsokat:
ACCESS VMSYS:MAINT.SAMPLES E
FILELIST * * E
Hogyan tudhatjuk meg, hogy kinek van engedélye egy adott file használatára?
Ezt a legegyszerűbben a FILELIST néhány új lehetőségével tudhatjuk meg:
FILELIST fn ft fm (SHARE
Itt megtudjuk, hogy a file-oknak kik a tulajdonosai.
A kurzort vigyük egy tetszőleges file-ra a listában, majd nyomjuk meg az F6 gombot (Auth). Ennek a hatására a gép kiírja, hogy mely felhasználók használhatják az adott file-t, és hogyan (READ/WRITE).
Az SFS-ben egy file pool-on belül lehetőségünk van a file/directory-jaink másik directory-ba való áthelyezésére. Ehhez a RELOCATE parancsot kell használni:
RELOcate fn ft dirid1 TO dirid2
vagy:
RELOcate dirid1 TO dirid2
A relokálás azzal jár, hogy az adott file vagy directory az eredeti helyén megszűnik létezni.
Például:
1. Helyezzük át a fődirectory-ban lévő ABC DATA nevű file-t az ADATOK nevű alkönyvtárba:
RELOcate ABC DATA . TO .ADATOK
2. Helyezzük át az ADATOK nevű directory-t (az összes benne lévő file-al együtt) a SZAMFEJT nevű alkönyvtárba: RELOcate .ADATOK TO .SZAMFEJT Ezzel a paranccsal tehát az ADATOK alkönyvtár megszűnik, és helyette létrejön a SZAMFEJT.ADATOK nevű alkönyvtár.Egy adott file megkeresése a filepool-ban:
FILEList fn ft fm (SEARCH
Látható, hogy ehhez a FILELIST egy új funkcióját használtuk fel. A fődirectory-nak azonban ACCESS-álva kell lennie, mégpedig a FILELIST-ben "fm"-ként megadott filemódhoz.
Példa: ACCess . A
FILEList ABC DATA A (SEARCH
Ez a parancs megkeresi az ABC DATA file-t, bármelyik alkönyvtárban található is az, majd a FILELIST-nél már ismert módon megjeleníti az összes előfordulást.
Osztott file-ok használata esetén előfordul, hogy a kollégáink által használt file nevek nekünk nem megfelelőek, mert pl. ugyanaz a nevük, mint a saját file-jainknak. Mivel a kérdéses file nem a miénk, ezért nem szabad (vagy nem is lehet) azt átnevezni. Ha pedig a file-t más néven átmásoljuk a saját directory-ba, ezzel a helypazarláson kívül azt érjük el, hogy nem látjuk az adott file változásait (mivel a másolat nem változik).
E fenti problémát oldják meg az alias nevek. Egy bázis file-hoz alias név az alábbi paranccsal definiálható: CREate ALIas fn1 ft1 dirid1 fn2 ft2 dirid2 A "dirid" helyett egy filemód is megadható.
Például:
CRE DIR .PELDA
ACC .PELDA C
CRE ALI DEEP SEA MAINT.SAMPLES EBI HAL C
FILEL * * C
A FILELIST-ben láthatjuk, hogy keletkezett egy EBI HAL nevű file-unk. Ezt ezentúl ilyen néven (is) használhatjuk, és a bázis file-ban (DEEP SEA a MANIT.SAMPLES directory-ban) bekövetkezett változásokat azonnal láthatjuk. Természetesen az EBI HAL file-t sem módosíthatjuk, mivel a bázis file-ra csak olvasási jogunk van.
Hogyan tudhatjuk meg a bázis file nevét? Ehhez ismét a FILELIST parancsot kell használnunk. Az előző példánál maradva:
FILELIST EBI HAL C (SHARE
A filelist képernyőn láthatjuk, hogy a file tulajdonosa (owner) kicsoda, és hogy a mi file-unk egy alias. Használjuk az
ALIALIST
parancsot (a FILELIST CMD oszlop alatt), vagy nyomjuk meg a PF9 gombot ezen a képernyőn (FILELIST SHARE), és így megtudhatjuk az eredeti (bázis) file nevét.
Ha egy file-ra több felhasználónak van írási jogosultsága, akkor a file-t az írás (pl.újraszerkesztés) idejére a file írásra való elérését le kell tiltani (azaz LOCK-olni kell), hogy a file ne menjen tönkre. Bár a CMS parancsok (pl. az XEDIT) az R/W file-okat a szerkesztés idejére lock-olják, azért előfordulhat, hogy ennél hosszabb időre szükséges a file elérését letiltani. Ilyenkor a következő parancsot használhatjuk:
CREate LOCk fn ft dirid {opt1} {opt2}
CREate LOCk dirid {opt1} {opt2}
{opt1} = SHAre | EXClusive | UPDate
{opt2} = SESsion | LASting
A SESSION lock a CMS session végén (pl. LOGOFF) automatikusan megszűnik, míg a LASTING lock mindaddig megmarad, míg a DELETE LOCK paranccsal nem töröljük.
Akinek csak olvasási joga van egy file-on, az csak SHARE lock-ot csinálhat, míg az írásjogú felhasználó minden félét.
A különféle lock típusok jelentése:
Update A többi felhasználó olvashatja az adott file-t, de nem módosíthatja, nem törölheti, és nem nevezheti át. Directory esetén a többi felhasználó csak olvashatja a directoryt, azaz nem nevezheti át, nem készíthet aldirectorykat, nem csinálhat alias neveket, és nem írhatja a file-okat, még akkor sem, ha van rá jogosultsága. A LOCK -ot kiadó felhasználó bármilyen műveletet végezhet.
Exclusive A többi felhasználó nem olvashatja (és természetesen nem is írhatja) a lock-olt filet. Directory lock-ja esetén a többi felhasználó nem olvashatja/írhatja egyik bázis file-t sem, és azok aliasait sem, tehát lényegében az adott directory-ban semmit sem csinálhat. Az exclusive LOCK -ot kiadó felhasználó bármilyen műveletet végezhet.
Share Mindenki olvashatja az adott file-t, de senki (beleértve a LOCK használóját is) sem módosíthatja. Senki nem nevezheti át és nem törölheti. Directory esetén mindenki olvahatja a directoryban lévő file-okat (már akinek egyébként van rá joga), de senki nem módosíthat semmit (még a LOCK kiadója sem).
Például:
CRE LOCK ABC DATA .ADATOK UPD SES
Ezzel egy UPDATE lock-ot csináltunk. Ez azt jelenti, hogy a file-t módosíthatjuk, míg más felhasználó azt csak olvashatja. A lock hatása a CMS session végén megszűnik.
Bárki, aki egy directory-t használhat, megtudhatja, hogy ki lock-olta a directory-t, vagy az abban lévő valamelyik file-t. Erre a következő parancs való:
Query LOCK fn ft dirid Query LOCK dirid
A parancs kiadja, hogy melyik felhasználó milyen típusú és időtartamú LOCK-ot adott ki a megadott file-ra vagy directory-ra.
A kiadott LOCK-okat a következő paranccsal szüntethetjük meg:
DELete LOCk fn ft dirid
DELete LOCk dirid
Például:
DEL LOC ABC DATA .ADATOK