Varför använda POSIX Spawn?
De posix_spawn () och posix_spawnp () funktioner används båda för att skapa en ny underordnad process. Barnprocessen kör sedan en fil. Dessa funktioner specificerades av POSIX för att standardisera metoden för att skapa nya processer för maskiner som inte har stöd för gaffelsystem. Dessa maskiner är vanligtvis små och saknar de inbäddade systemen för lMMU-support.
De två funktionerna kombinerar gaffel och exekvering, med några ytterligare steg som kommer att köra barnet. De fungerar som en delmängd av funktioner, vanligtvis uppnås med en gaffel, för alla systemanrop och inbäddade system som saknar sådan funktionalitet.
Exempel 1: posix_spawn ()
I det här exemplet använder vi funktionen spawn () för att skapa och utföra en ny barnprocess. Sedan kommer vi att förklara alla relevanta argument som används i funktionen.
Argumenten som används i exemplet är följande:
Argument | Beskrivning |
---|---|
Används för att definiera alla gyter som utför operationer. | |
väg | Namnet på sökvägen som ska köras. |
fd_count | Antalet poster med matrisen fd_map. Om fd_count är lika med 0 ignoreras fd_map. I sådana fall ärver barnprocessen alla filbeskrivare och ignorerar de som har modifierats. |
fd_map | En uppsättning filbeskrivare som ärvs av barnprocessen. Här, om värdet på fd_count inte är 0, behövs fd_map för att fd_count-filbeskrivarna upp till det högsta värdet OPEN_MAX. Det har: · Ingången för barnprocessen · Utgången · Felvärdena |
ärva | Struct-arvet visar att användare vill att deras barnprocess ska ärva allt från föräldern. |
argv | Pekaren till en viss argumentvektor. Argv [0] -värdet kan inte vara NULL och måste vara det filnamn som laddas. Argv-värdet kan inte vara lika med NULL. |
envp | Pekar på en rad karaktärspekare. Var och en av pekarna i denna matris pekar på en miljövariabel. Slutpunkten för matrisen är en NULL-pekare. |
Exempel 2: test.c
I följande exempel skapas en ny underordnad process för att köra kommandot med / bin / sh -c. Detta är värdet som skickades som det första argumentet. De testa.c koden är som följer:
I exemplet ovan kallade vi biblioteken, sedan kallade vi ge upphov till.h rubrik. Du kommer också att se posix_spawn () kallas för att skapa en barnprocess i exemplet ovan. De ge upphov till och spawnp används i stället för gaffel och exec funktioner. Ge upphov till() har flexibilitet och ger användarna mycket lätthet på många sätt. Det är lite olikt från systemet() och exec (). Det kommer tillbaka och skapar en ny barnprocess. I vårt exempel är det pid. Ovan kan du se att vänta-funktionen vänteläge (), sedan systemet() är använd. Lägg märke till att ge upphov till() och gaffel() anropsprocesser är desamma, och metoden för implementering är ungefär densamma för båda funktionerna.
Vi utför nu exemplet med hjälp av a gcc kompilator. Du kan också använda vilken annan kompilator du än väljer:
$ sudo gcc-test.c-lrt
Kör sedan följande:
$ ./ a.ut
Utgången från ovanstående kommando ser ut som följer:
Barnet pid kommer att skapas, som du kan se i ovanstående utdata.
Bibliotek
Libc: Använd -l c för att länka gcc kompilator. Observera här att detta bibliotek ingår automatiskt.
Ge upphov till()
De ge upphov till() funktionen är baserad på POSIX 1003.1d utkast standard som används som posix_spawn (). C-biblioteket innehåller spawn * () -funktioner. Här listar vi några suffix, tillsammans med deras beskrivningar:
e: används som en matris för miljövariabler.
l: används som en NULL-avslutad lista över argumenten som används i programmet.
p: används för att definiera en relativ sökväg. Om sökvägen inte har ett snedstreck i sitt värde använder systemet och söker i PATH-miljövariabeln för något liknande program.
v: fungerar som en vektor av argument inuti programmet.
Kartläggning av filbeskrivare
I ge upphov till(), vi övar på fd_count och fd_map argument för att kalla ut filbeskrivarna. Den anger vilket barn som ska ärva.
Antalet som används som en filbeskrivare för barnprocessen beror på dess placering inuti fd_map. Här kommer vi att överväga exemplet på föräldern med filbeskrivare värderade 1, 3 och 5, då kommer kartläggningen att vara ungefär så här:
>> int fd_map = 1, 3, 5;För barnet | För föräldern |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Observera att om du använder det explicita fd_map För att matcha dessa filbeskrivare med barnet och föräldern måste du mappa SPWAN_FDCLOSE för att fortsätta.
Arvsflaggor
I Spawn måste användare ropa ut någon av följande flaggor vid arv. Några exempel på Spawn-flaggor och deras beskrivningar ges nedan:
Flagga | Beskrivning |
---|---|
SPAWN_ALIGN_DEFAULT | Denna flagga används för att ställa in standardinställningarna för inställningen för justering. |
SPAWN_ALIGN_FAULT | Denna flagga används för feljustering av datareferenserna. |
SPAWN_ALIGN_NOFAULT | Denna flagga används för att åtgärda feljusteringen. |
SPAWN_DEBUG | Denna flagga används för att felsöka kärnan. |
SPAWN_EXEC | SPAWN fungerar som exec * () med den här flaggan. |
SPAWN_EXPLICIT_CPU | Denna flagga används för att ställa in körmasken och ärva masken = kör maskmedlem. |
SPAWN_EXPLICIT_SCHED | Denna flagga används för att ställa in schemaläggningspolicyn. |
De <ge upphov till.h> definierar den masken SPAWN_ALIGN_MASK används för att rikta in flaggorna ovan.
pid_t pgroup | Den underordnade processgruppen om du anger SPAWN_SETGROUP i flaggans medlem. |
int runmask | Körmasken för barnprocessen för att ärva de masker som överenskommits baserat på värdet av denna medlem. |
sigset_t sigmask | Signalmasken för barnprocessen som används för att ange status för flaggmedlemmar. |
sigset_t sigdefault | Uppsättningen av de underordnade processerna för de förvalda signalerna. |
Fel
De posix_spawn () och posix_spawnp () funktioner kan också misslyckas i vissa fall, till exempel följande:
EINVAL: Detta är fallet när värdet identifieras av file_actions eller attrp är inte korrekt och adekvat.
När den underliggande gaffeln (2), gaffeln (2) eller klonen (2) misslyckas, ge upphov till() funktioner returnerar ett felnummer.
ENOSYS: Detta är fallet om funktionen och dess stöd inte ingår eller tillhandahålls i ett system.
Slutsats
Denna handledning behandlade de grundläggande funktionerna som tillhandahålls av POSIX_spawn () och de funktioner som den använder för att utföra och utföra dess funktioner. Vi täckte också flaggor och fel som vanligtvis används av Spawn.