{"id":31229,"date":"2019-10-31T21:40:10","date_gmt":"2019-10-31T18:40:10","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-3-process-api-perevod\/"},"modified":"2019-10-31T21:40:10","modified_gmt":"2019-10-31T18:40:10","slug":"operating-systems-three-easy-pieces-part-3-process-api-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-3-process-api-perevod","title":{"rendered":"Operativsystemer: Tre enkle stykker. Del 3: Prosess-API (oversettelse)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Innledning til operativsystemer<\/h1>\n<p>\nHei, Habr! Jeg \u00f8nsker \u00e5 presentere for deg en serie med oversatte artikler fra en litteratur som jeg synes er interessant \u2014 OSTEP. I dette materialet blir arbeidet til UNIX-lignende operativsystemer behandlet temmelig grundig, nemlig arbeidet med prosesser, forskjellige planleggere, minne og andre lignende komponenter som utgj\u00f8r et moderne OS. Den originale teksten til alt materialet kan du se her <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">here<\/a><\/noindex>. Vennligst merk at oversettelsen er gjort uprofesjonelt (temmelig fritt), men jeg h\u00e5per jeg har bevart den generelle meningen.<\/p>\n<p>Laboratoriearbeid knyttet til emnet kan finnes her:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">originalen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">originalen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">min personlige tilpasning<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nAndre deler:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Del 1: Introduksjon<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Del 2: Abstraksjon: prosess<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Del 3: Innf\u00f8ring i prosess-API<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nOg du kan ogs\u00e5 sjekke kanalen min p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">telegram<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<b>Alarm!<\/b> det finnes et laboratorium for denne forelesningen! se <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">github<\/a><\/noindex><\/p>\n<h2>Prosess-API<\/h2>\n<p>La oss se p\u00e5 et eksempel p\u00e5 opprettelse av en prosess i et UNIX-system. Dette skjer gjennom to systemanrop <b>fork()<\/b> og <b>exec()<\/b>.<\/p>\n<h3>Anropet fork()<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 3: Prosess-API (oversettelse)\" src=\"\/wp-content\/uploads\/2019\/04\/c0c39726560e18a82ae05a31b43f92c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa oss se p\u00e5 et program som utf\u00f8rer et fork()-anrop. Resultatet av kj\u00f8ringen vil v\u00e6re som f\u00f8lger.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 3: Prosess-API (oversettelse)\" src=\"\/wp-content\/uploads\/2019\/04\/3ddddbaf5bbb38e9882827da0513805a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f8rst g\u00e5r vi inn i funksjonen main() og utf\u00f8rer utskrift av en streng p\u00e5 skjermen. Strengen inneholder prosessidentifikatoren som i originalen kalles <b>PID<\/b> eller prosessidentifikator. Denne identifikatoren brukes i UNIX for \u00e5 referere til prosessen. Den f\u00f8lgende kommandoen vil utf\u00f8re et kall til fork(). P\u00e5 dette tidspunktet blir en nesten identisk kopi av prosessen opprettet. For operativsystemet ser det ut som om det er to kopier av det samme programmet som kj\u00f8rer, som igjen vil forlate funksjonen fork(). Den nylig opprettede barneprosessen (i forhold til den opprinnelige forelderen) vil ikke bli utf\u00f8rt fra funksjonen main() videre. Det er viktig \u00e5 huske at barneprosessen ikke er en n\u00f8yaktig kopi av forelderen, spesielt fordi den har sitt eget adresseomr\u00e5de, egne registre, sin egen peker til kj\u00f8rbare instruksjoner osv. Dermed vil verdien som returneres til den som kaller fork()-funksjonen v\u00e6re forskjellig. Spesielt vil forelderen motta PID-verdien til barneprosessen, mens barnet vil motta verdien lik 0. P\u00e5 bakgrunn av disse returkodene kan prosessene i fremtiden skille fra hverandre og tvinges til \u00e5 utf\u00f8re sitt eget arbeid. Utf\u00f8relsen av dette programmet er imidlertid ikke strengt definert. Etter deling i to prosesser begynner OS \u00e5 overv\u00e5ke dem, og planlegge arbeidet deres. I tilfellet med kj\u00f8ring p\u00e5 en enkeltkjernet prosessor, vil en av prosessene, i dette tilfellet - forelderen, fortsette arbeidet, og deretter vil kontrollen bli overf\u00f8rt til barneprosessen. Ved neste oppstart kan situasjonen utvikle seg annerledes.<\/p>\n<h3>Kallet wait()<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 3: Prosess-API (oversettelse)\" src=\"\/wp-content\/uploads\/2019\/04\/abb10671424f1889fbbb3facae739029.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa oss se p\u00e5 f\u00f8lgende program. I dette programmet vil kallet <b>wait()<\/b> forelderen alltid vente p\u00e5 at barneprosessen skal avslutte. I dette tilfellet vil vi f\u00e5 en strengt definert tekstutskrift p\u00e5 skjermen.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 3: Prosess-API (oversettelse)\" src=\"\/wp-content\/uploads\/2019\/04\/7e8ea54531b7717b7b42802550afd27b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Kallet exec()<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 3: Prosess-API (oversettelse)\" src=\"\/wp-content\/uploads\/2019\/04\/dfe3a41c03bc35fd716a1b4c3af68c2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa oss se p\u00e5 kallet <b>exec()<\/b>. Denne systemkallet er nyttig n\u00e5r vi \u00f8nsker \u00e5 starte et helt annet program. Her skal vi kalle <b>execvp()<\/b> for \u00e5 kj\u00f8re programmet wc, som er et program for telling av ord. Hva skjer egentlig n\u00e5r exec() kalles? Denne funksjonen f\u00e5r som argumenter navnet p\u00e5 den kj\u00f8rbare filen og noen parametere. Deretter blir koden og statiske data lastet fra den kj\u00f8rbare filen, og den n\u00e5v\u00e6rende kodesegmentet blir overskrevet. Andre minnedeler, som stakk og heap, blir reinitialisert. Etter dette utf\u00f8rer OS ganske enkelt programmet, og gir det et sett med argumenter. Dermed har vi ikke opprettet en ny prosess, men bare transformert det n\u00e5v\u00e6rende kj\u00f8rende programmet til et annet kj\u00f8rende program. Etter \u00e5 ha kalt exec() f\u00e5r barneprosessen inntrykk av at den opprinnelige programvaren aldri ble startet.<\/p>\n<p>Denne kompleksiteten ved oppstart er helt normal for Unix-shell, og lar denne skjellkjernen kj\u00f8re kode etter kallet <b>fork()<\/b>, men f\u00f8r kallet <b>exec()<\/b>. Et eksempel p\u00e5 slik kode kan v\u00e6re \u00e5 tilpasse skjellmilj\u00f8et til behovene til det kj\u00f8rende programmet f\u00f8r det faktisk starter.<\/p>\n<p><b>Shell<\/b> er bare et brukerprogram. Det viser deg en kommandolinje og venter p\u00e5 at du skal skrive noe der. I de fleste tilfeller, hvis du skriver navnet p\u00e5 programmet der, vil shell finne dets plassering, kalle fork()-metoden, og deretter, for \u00e5 opprette en ny prosess, vil det kalle en av typene exec() og vente p\u00e5 at den fullf\u00f8res ved hjelp av wait(). N\u00e5r barneprosessen avsluttes, vil shell komme tilbake fra wait()-kallet, vise deg kommandolinjen igjen og vente p\u00e5 at neste kommando blir skrevet inn.<\/p>\n<p>Skille mellom fork() &amp; exec() lar shell gj\u00f8re f\u00f8lgende ting, for eksempel:<br \/>\n<b>wc file &gt; new_file.<\/b><\/p>\n<p>I dette eksemplet er utdataene fra programmet wc omdirigert til en fil. M\u00e5ten shell oppn\u00e5r dette p\u00e5 er ganske enkel \u2014 n\u00e5r barneprosessen opprettes f\u00f8r kallet <b>exec()<\/b>, stenger shell standard utdata-str\u00f8mmen og \u00e5pner filen <b>new_file<\/b>, slik at all utdata fra det senere kj\u00f8rte programmet <b>wc<\/b> vil bli omdirigert til filen i stedet for skjermen.<\/p>\n<p><b>Unix-r\u00f8r<\/b> er implementert p\u00e5 en lignende m\u00e5te, med den forskjellen at de bruker pipe()-kallet. I dette tilfellet vil utdata-str\u00f8mmen til prosessen v\u00e6re koblet til en pipe-k\u00f8 som ligger i kjernen, som ogs\u00e5 vil v\u00e6re koblet til inndata-str\u00f8mmen til en annen prosess.<br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/447182\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23195,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31229","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-3-process-api-perevod\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 3: Process API (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-3-process-api-perevod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:40:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40:10+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Operativsystemer: Tre enkle deler. Del 3: Prosess API (oversettelse) | ProHoster","description":"Introduksjon til operativsystemer Hei, Habr! Jeg vil gjerne presentere for deg en serie med oversettelsesartikler av en litteratur jeg synes er interessant - OSTEP.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-3-process-api-perevod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 3: Process API (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.","og:url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-3-process-api-perevod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:40:10+00:00","article:modified_time":"2019-10-31T18:40:10+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31229","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 05:09:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:20:31","updated":"2026-01-21 05:09:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/31229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=31229"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/31229\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/23195"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=31229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=31229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=31229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}