Väsäilin ohjelmaa joka kääntää annetun c-koodin ja tarkistaa koodin oikeellisuuden. Ohjelma koostuu kahdesta osasta, sivu.php, joka sisältää lomakkeen koodin kirjoitusta varten, sekä plop.php, joka käsittelee lomakkeen sisällön.
Homma toimii unix-palvelimella vallan mainiosti, mutta omalla koneella en saanut sitä toimimaan. Ohjelma.c kyllä tallentuu levylle, mutta käännös ei toimi. Asensin koneelle kääntäjäksi DJGPP:n ja koodin kääntäminen komentoikkunassa onnistuu hyvin. Mutta tuon php-skriptin kautta käännös ei toimi. Missä mahtaa olla vika? Käyttiksenä Windows XP Pro.
sivu.php
<html> <font size="+2">Ohjelmointitehtävät</font><br><br> Tehtävä 1: Kirjoita ohjelma, joka tulostaa näytölle tekstin: "Hello"<br> <FORM method="post" action="plop.php"> <TEXTAREA name="koodi" rows="12" cols="50"></TEXTAREA> <p><input type='submit' value='Vastaa'></p> </FORM> </html>
plop.php:
<?php $ff = fopen("ohjelma.c", "w"); fwrite($ff, stripcslashes($_POST["koodi"])); fclose($ff); echo '<pre>'; // Outputs all the result of shellcommand "ls", and returns // the last output line into $last_line. Stores the return value // of the shell command in $retval. $last_line = system('gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe 2>virhe', $retval); // Printing additional info echo ' </pre> <hr />Käännös palautti: ' . $retval; if ($retval == 0) { //Käännös onnistui system('ohjelma > temp'); system('diff -b tulos temp', $retu); echo ' <hr />Vertailu palautti ' . $retu; if ($retu == 0) { //Ohjelman ajaminen onnistui echo '<P>Ohjelman ajo onnistui'; } else { echo '<P>Ohjelma tulosti<pre>'; system('cat temp'); echo '</pre><P>Kun sen olisi pitanyt tulostaa<P><pre>'; system('cat tulos'); echo '</pre>'; } } else { //Käännöksessä virheitä echo '<hr />Virheitä: <pre>'; system('cat virhe'); echo '</pre>'; } echo '<pre>'; ?>
Minulla ainakin windows tekee ylimääräisiä rivejä tiedostoon. Olen saanut ne pois rtrim-funktiolla
Pekka Mansikka kirjoitti:
Minulla ainakin windows tekee ylimääräisiä rivejä tiedostoon. Olen saanut ne pois rtrim-funktiolla
Siis mihin tiedostoon tässä tapauksessa? Ohjelma.c tallentuu ihan oikein, eli siihen ei ainakaan mitään ylimääräisiä rivejä tule.
Tämä meneekin mielenkiintoiseksi. Kokeilin ohjelmaa toisella unix-palvelimella, eikä toiminut. Eli yhdellä palvelimella toimii, toisella ei... Tuo palvelin, jolla käännös toimii, on kouluni sisäisessä verkossa. Voisiko käyttöoikeuksilla olla jotain tekemistä tämän kanssa? Eli oikeudet ei riitä tuon käännösprosessin suorittamiseen php:lla muissa kuin tuossa intranetin palvelimessa? Tämä on siis täyttä newbie-arvailua...
system -funktio rajotetaan tiettyyn hakemistoon, jos PHP:n safe mode on päällä. Kannattaa myös huomata, että sulla pitää olla sillä Windows-koneellaki nuo Unix-ohjelmat (diff, cat), jotta tuo toimii oikein.
Eipä ole PHP:n safe mode päällä. Pitäisiköhän suosiolla asentaa Linux niin saisi homman toimimaan, vai saako diff:n ja cat:n toimimaan Windows-koneellakin? Koneella olisi muutakin käyttöä eli pitäisin kyllä XP:n käyttiksenä jos vaan mahdollista.
Asentamalla Cygwin-ympäristön saat Unix-työkalut Windows-koneeseen.
Loistavaa, täytyy asentaa ja testata. En tiedä auttaako kuitenkaan tuohon varsinaiseen ongelmaan, eli tuon system-funktion suorittamiseen.
Nyt on cygwin asennettuna ja hyvin tuntuvat Unix-komennot toimivan. Ja c-koodi kääntyy hyvin gcc:llä, mutta ei tuon plop.php:n kautta. Pitäisikö tuota plop.php:tä muuttaa jotenkin (paitsi gpp-kääntäjän tilalle gcc) vai pitäisikö sen toimia tuollaisenaan cygwinin kanssa?
No niin, nyt löytyi vika. Eli kaikkiin system-komentoihin piti vain lisätä cmd tyyliin:
system('cmd gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe 2>virhe', $retval);
Nyt toimii kaikki kuten pitääkin. Kiitoksia vinkeistä, etenkin tuosta cygwinistä.
Iloitsinpa liian aikaisin. Käännös kyllä palauttaa arvon 0, mutta koodin kääntämisen sijaan tapahtuu vain komentoikkunan avautuminen. Jostakin syystä system-komento tuntuu toimivan ainostaan cmd:n kanssa, eli system:llä ei pysty tekemään muuta kuin avaamaan komentoikkunan. Miksi näin? Tein tällaisen simppeli php-pätkän jolla testailin eri system-käskyjen suorittamista:
<?php system('gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe'); ?>
"gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe" toimii kyllä mainiosti Windowsin "Run"-ikkunassa, mutta system:n kautta tulee vain virheilmoitus "The system cannot execute the specified program."
Ja kuten aiemmin todettua, PHP:n safe_mode ei ole päällä.
Hmm... Koitahan tehä "cmd /C gpp blah", tuon /C -vivun pitäis laittaa komentotulkin ajamaan tuo parametrina tuleva komento.
Ei vaikutusta. Nyt kun tuo cygwin on asennettuna ajattelin kokeilla jos käännös onnistuisi paremmin gcc:llä. Kun tuo gpp ei jostain syystä toimi system-komennolla. No, gcc toimii kyllä muuten, mutta seuraa virheilmoitus:
ohjelma.c:1: stdio.h: No such file or directory
Kokeiln gcc:llä kääntämistä command promptissa ja huomasin että käännös onnistuu vain tietyssä hakemistossa (c:/DJGPP/bin tai c:/cygwin/bin). Muutin ympäristömuuttujiin INCLUDE-hakemistoksi c:/DJGPP/bin, mutta mikään ei muuttunut. Ympäristömuuttujista tuo ongelma ymmärtääkseni johtuu...
Menin siitä mistä aita on matalin ja laitoin koko höskän tuonne c:/cygwin/bin:iin ja tein siitä juurihakemiston Apachelle. Ja nyt vihdoinkin toimii kuten pitääkin.
Siis laitoitko ton hakemiston INCLUDE-ympäristömuuttujaan? PATH olisi se oikea. Sieltä haetaan ajettavia ohjelmia joille ei anneta suoraa polkua.
Kokeilin sekä INCLUDEa että PATHia. Ei vaikutusta...
Aihe on jo aika vanha, joten et voi enää vastata siihen.