[Linux suse - C] system()

Pagina: 1
Acties:

  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
Ik doe het volgende

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 #include<stdio.h>
char cLetter='a';

int main()
{
char acCommando[8];

do{
sprintf(acCommando,"echo -n %c", cLetter)
signal(..);
system(acCommando);
}while(1);

}

signal(..)
{
cLetter++;
}


Toch krijg ik steeds de melding impliciet declaration of function 'system' .

Ik heb al wat rondgevraagt naar wat ik nu vergeet maar niemand heeft een idee. De header is aanwezig en de aanroep is okey volgens vele voorbeelden op t internet.

Wanneer ik de system call veranderen naar system("echo -n a"); krijg ik ook nog steeds dezelfde fout/warning. Nu is een warning niet netjes maar een enkel teken afdrukken doet hij dan nog wel. Wanneer ik dit teken verander in een functie dat pakt hij hem gewoon niet meer mee.

Hopenlijk heeft iemand van jullie wel door wat ik vergeet hier... 8)

[ Voor 19% gewijzigd door Emiel1984 op 14-05-2006 02:27 ]

[LTS][MTS][HTS]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21-02 03:42
system() en signal() zitten in stdlib.h, en niet stdio.h?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Naast wat Soultaker zegt: system('echo -n a') zal niet veel doen omdat ' gebruikt wordt voor characters en " voor strings.

Rare manier van strings concatten trouwens. Wel eens van sprintf gehoord? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
-NMe- schreef op zaterdag 13 mei 2006 @ 19:17:
Naast wat Soultaker zegt: system('echo -n a') zal niet veel doen omdat ' gebruikt wordt voor characters en " voor strings.

Rare manier van strings concatten trouwens. Wel eens van sprintf gehoord? :P
De stdlib.h heeft de warning opgelost.

jaja ik weet t sprintf komt eraan lol :+ .

Het vreemde is nog steeds dat t programma minder werkt. Hij reageert op een signal (ctrl c). Als ik printf("%c", cLetter); gebruik is het programma gewoon goed maar met de system(acCommando) is de pc ineens erg traag en pakt hij eigenlijk de hele interrupt (ctrl c) niet meer.

[LTS][MTS][HTS]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

De string die je sprintf't gaat overigens nooit in je buffer passen. "echo -n a" is al 9 characters, plus er moet nog een trailing \0 in.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
.oisyn schreef op zaterdag 13 mei 2006 @ 19:42:
De string die je sprintf't gaat overigens nooit in je buffer passen. "echo -n a" is al 9 characters, plus er moet nog een trailing \0 in.
Ik heb nog nooit ervan gehoord dat er een trailing \0 bij moest. Hij heeft hier ook geen problemen mee en wanneer ik wel deze \0 toevoeg krijg ik ook een warning [b] Embedded '\0' in format.

Wanneer ik alleen de array van chars groter maak reageert hij nog niet beter(eigenlijk werkt hij eerder niet dan wel) op de signal.

Edit: hij is al 9 groot, je vergeet de 0 :+

[ Voor 15% gewijzigd door Emiel1984 op 13-05-2006 20:04 ]

[LTS][MTS][HTS]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Misschien moet je eens opzoeken wat strings in C eigenlijk zijn.

In C wordt een string gevormd door een array van characters, gevolgd door een nulkarakter ('\0') om aan te geven dat dat het einde van de string is. Wanneer je dit doet:
C:
1
char *s = "blaat";

Dan wordt er in het geheugen een blokje geheugen gereserveerd van 6 bytes, wat er als volgt uitziet:
'b', 'l', 'a', 'a', 't', '\0'.

Je hoeft die \0 niet te aan te geven, maar je moet er wel ruimte voor overhouden. Als je een character array van 8 posities aanmaakt, dan kun je daar maar 7 tekens in kwijt, om daarna ruimte over te houden voor je nulkarakter. Doe je dat niet, dan ga je in niet-gealloceerd geheugen schrijven en heb je kans dat er vanalles misgaat.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
-NMe- schreef op zaterdag 13 mei 2006 @ 20:07:
Misschien moet je eens opzoeken wat strings in C eigenlijk zijn.
okey dacht dat je met een array van chars daar niet aan hoefde te denken omdat de array zelf al het einde aan zou geven dacht ik zo.. Maar iig bedankt voor de info.

[LTS][MTS][HTS]


Verwijderd

emiel1984 schreef op zaterdag 13 mei 2006 @ 20:01:
[...]

Edit: hij is al 9 groot, je vergeet de 0 :+
Je geeft de te alloceren grootte op, niet de laatste index. "char bla[8]" is dus wel degelijk maar 8 lang, en heeft indices 0 tot en met 7.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

emiel1984 schreef op zaterdag 13 mei 2006 @ 20:01:

Ik heb nog nooit ervan gehoord dat er een trailing \0 bij moest.
Dan wordt het eens tijd dat je een manual door gaat lezen. Een string in C is niets meer dan een pointer naar een teken (hence char *), naar het eerste teken van de string om precies te zijn. Hoe kan een functie (zoals system()) dan weten waar de string eindigt? Juist, door te zoeken naar de 0 op het eind. De strlen() doet overigens precies dat, bekijken op welke positie vanaf de pointer die je geeft waar de 0 zit.
Hij heeft hier ook geen problemen mee en wanneer ik wel deze \0 toevoeg krijg ik ook een warning Embedded '\0' in format.
sprintf voegt die trailing 0 al toe, zoals je in de documentatie had kunnen lezen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
.oisyn schreef op zondag 14 mei 2006 @ 00:23:
[...]

Dan wordt het eens tijd dat je een manual door gaat lezen. Een string in C is niets meer dan een pointer naar een teken (hence char *), naar het eerste teken van de string om precies te zijn. Hoe kan een functie (zoals system()) dan weten waar de string eindigt? Juist, door te zoeken naar de 0 op het eind. De strlen() doet overigens precies dat, bekijken op welke positie vanaf de pointer die je geeft waar de 0 zit.


[...]

sprintf voegt die trailing 0 al toe, zoals je in de documentatie had kunnen lezen.
Lees aub eerst is wat ik eerder heb gepost, je bent al de tweede die reageert op iets waarop ik zelf naderhand al antwoord had gegeven!!


Edit1;
Als je toevallig weet waarom het programma met een system(echo...) niet meer op een signal reageert maar wel met een printf(..) dan heb ik daar meer aan ;) . En ja de array van chars heb ik allang groter gemaakt :+ . Zelfs met gewoon invullen ( system("echo -n a"); ) werkt t namelijk niet.

[ Voor 19% gewijzigd door Emiel1984 op 14-05-2006 02:16 ]

[LTS][MTS][HTS]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Naderhand inderdaad. ;) .oisyn probeert te zeggen dat je niet kan programmeren zonder een naslagwerk (digitaal danwel op papier) erbij te hebben. Je maakt in dit topic meer dan één beginnersfout, en dat is simpelweg te wijten aan een gebrek aan kennis en ervaring. Kennis doe je in de eerste plaats op door handleidingen te lezen van de taal en de specifieke functionaliteit die je wil gebruiken, en ervaring doe je op door die kennis tot uitvoer te brengen.

Als ik dit topic zo bekijk probeer je ervaring op te doen, zonder eerst je kennis op peil te brengen. Ervaring is prima, maar je leert er niks van als je niet een stabiele basis in je hoofd hebt. :)
emiel1984 schreef op zondag 14 mei 2006 @ 02:04:
En ja de array van chars heb ik allang groter gemaakt :+ . Zelfs met gewoon invullen ( system('echo -n a'); ) werkt t namelijk niet.
-NMe- schreef op zaterdag 13 mei 2006 @ 19:17:
Naast wat Soultaker zegt: system('echo -n a') zal niet veel doen omdat ' gebruikt wordt voor characters en " voor strings.

[ Voor 27% gewijzigd door NMe op 14-05-2006 02:10 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
-NMe- schreef op zondag 14 mei 2006 @ 02:08:
Naderhand inderdaad. ;) .oisyn probeert te zeggen dat je niet kan programmeren zonder een naslagwerk (digitaal danwel op papier) erbij te hebben. Je maakt in dit topic meer dan één beginnersfout, en dat is simpelweg te wijten aan een gebrek aan kennis en ervaring. Kennis doe je in de eerste plaats op door handleidingen te lezen van de taal en de specifieke functionaliteit die je wil gebruiken, en ervaring doe je op door die kennis tot uitvoer te brengen.
[...]
Was een typfoutje, die ' moest idd " zijn maar dat werkte dus niet om t probleem te verhelpen en bedankt voor de verdere info.... en tjah omdat ik 1 ding niet wist wordt ik er 3 keer op aangesproken :? t vind ik niet echt leuk maargoed dat is geweest ...

[ Voor 17% gewijzigd door Emiel1984 op 14-05-2006 02:23 ]

[LTS][MTS][HTS]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

En wat krijg je dan voor resultaat als je letterlijk system("echo -n a") doet? Compileert het niet? Krijg je een foutmelding van een andere soort? Krijg je at runtime een foutmelding? Doet het zaakje gewoon niks? De foutmelding die je in je startpost noemt voor het aangeven van een statische string gaat hier niet meer op, en verder heb je nooit gezegd wat er hiermee dan fout gaat, vandaar. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
-NMe- schreef op zondag 14 mei 2006 @ 02:30:
En wat krijg je dan voor resultaat als je letterlijk system("echo -n a") doet? Compileert het niet? Krijg je een foutmelding van een andere soort? Krijg je at runtime een foutmelding? Doet het zaakje gewoon niks? De foutmelding die je in je startpost noemt voor het aangeven van een statische string gaat hier niet meer op, en verder heb je nooit gezegd wat er hiermee dan fout gaat, vandaar. :)
Ik krijg geen foutmelding bij het compilen dat is t vage.... Wanneer ik t programma start en ik activeer de interrupt met ctr c werkt t gewoon niet. De functie die hij dan aan zou moeten roepen roept hij domweg gewoon niet aan. Wanneer ik de system verander in een printf() dan werkt t wel en wordt de functie wel aangeroepen.

[LTS][MTS][HTS]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

emiel1984 schreef op zondag 14 mei 2006 @ 02:04:

Lees aub eerst is wat ik eerder heb gepost, je bent al de tweede die reageert op iets waarop ik zelf naderhand al antwoord had gegeven!!
Lees aub mijn post nog eens door, ik tracht uit te leggen waarom die 0 er überhaupt in staat. Het is hier geen helpdesk waar wij jouw vragen oplossen, de meeste mensen die hier posten hebben interesse in programmeren en willen graag wat bijleren. Als jij dat niet wilt, soit, maar ga dan niet moeilijk doen als je het antwoord waar je op zit te wachten niet direct krijgt.

En als je nou eens deed wat al 3 keer gezegd is, namelijk de documentatie lezen (die van system() in dit geval), dan kon je zien dat een SIG_INT geignored werd tijdens het uitvoeren van een system command. Aangezien je het in een loopje doet wordt de meeste tijd gespendeerd in het uitvoeren van dat system commando, en is de kans dus klein dat je op ctrl-c drukt tussen 2 system() calls in. Met printf() werkt het dan uiteraard wel omdat dan helemaal geen system command uitgevoerd wordt; je blijft gewoon in je eigen process. (Dit alles koste mij maar liefst 2 minuten van m'n tijd om uit te zoeken, terwijl ik amper kennis heb van linux. Als je dus zelf even wat meer onderzoek had gedaan had je om 20:00 vanavond je antwoord al gehad ;))

[ Voor 52% gewijzigd door .oisyn op 14-05-2006 03:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
.oisyn schreef op zondag 14 mei 2006 @ 03:05:
[...]

En als je nou eens deed wat al 3 keer gezegd is, namelijk de documentatie lezen (die van system() in dit geval), dan kon je zien dat een SIG_INT geignored werd tijdens het uitvoeren van een system command.
Eej ik heb nu nogmaals is deze pagina is doorgekeken over system : MSDN
Maar kan het dus echt niet terugvinden excuus al ik erover heen lees maar zou graag willen weten waar je je info vandaan hebt.

[LTS][MTS][HTS]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Je bent aan het werken op Linux en kijkt dan op MSDN om je probleem op te lossen? 8)7

Tik voor de grap eens man system in je shell...
DESCRIPTION

The system() function hands the argument string to the command inter-
preter sh(1). The calling process waits for the shell to finish execut-
ing the command, ignoring SIGINT and SIGQUIT, and blocking SIGCHLD.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
-NMe- schreef op zondag 14 mei 2006 @ 13:01:
Je bent aan het werken op Linux en kijkt dan op MSDN om je probleem op te lossen? 8)7

Tik voor de grap eens man system in je shell...

[...]
Okey thks, dacht dat msdn wel compleet was... :+ Heb linux nu niet aanstaan vandaar dat ik ff op msdn zocht..

[LTS][MTS][HTS]


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

-NMe- schreef op zondag 14 mei 2006 @ 13:01:
Je bent aan het werken op Linux en kijkt dan op MSDN om je probleem op te lossen? 8)7
Het zal je verbazen hoeveel nuttige info er voor een linux programmeur instaat ;)
Uiteraard niet dingen als gtkmm o.i.d., maar de basis komt aardig overeen :)

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 21-02 22:08

Emiel1984

Made in NL

Topicstarter
moto-moi schreef op zondag 14 mei 2006 @ 13:09:
[...]

Het zal je verbazen hoeveel nuttige info er voor een linux programmeur instaat ;)
Uiteraard niet dingen als gtkmm o.i.d., maar de basis komt aardig overeen :)
Precies wat ik al dacht thks kom ik toch niet helemaal dom over ghaha :Y)

[LTS][MTS][HTS]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

moto-moi schreef op zondag 14 mei 2006 @ 13:09:
Het zal je verbazen hoeveel nuttige info er voor een linux programmeur instaat ;)
Uiteraard niet dingen als gtkmm o.i.d., maar de basis komt aardig overeen :)
Weet ik, maar als ik specifiek voor Linux bezig ben kijk ik toch altijd eerst wel even in de manpages. En iets als de system() functie is logischerwijs dermate OS-afhankelijk dat ik daar niet snel voor in de MSDN zou kijken. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-02 23:27
moto-moi schreef op zondag 14 mei 2006 @ 13:09:
Het zal je verbazen hoeveel nuttige info er voor een linux programmeur instaat ;)
Uiteraard niet dingen als gtkmm o.i.d., maar de basis komt aardig overeen :)
Het is idd een behoorlijk handig naslagwerk. Maar system calls/signals zul je echt met een manpage moeten doen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

emiel1984 schreef op zondag 14 mei 2006 @ 13:05:
[...]


Okey thks, dacht dat msdn wel compleet was... :+ Heb linux nu niet aanstaan vandaar dat ik ff op msdn zocht..
"man system" werkt in google ook wel.
moto-moi schreef op zondag 14 mei 2006 @ 13:09:
[...]

Het zal je verbazen hoeveel nuttige info er voor een linux programmeur instaat ;)
Uiteraard niet dingen als gtkmm o.i.d., maar de basis komt aardig overeen :)
Maar helaas werkt Windows niet met signals :)

[ Voor 30% gewijzigd door .oisyn op 15-05-2006 11:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

moto-moi schreef op zondag 14 mei 2006 @ 13:09:
Het zal je verbazen hoeveel nuttige info er voor een linux programmeur instaat ;)
Ja, totdat het overgaat op *NIX specifieke zaken. Dan vermeld MSDN het niet, of de info klopt niet. Ik heb als stelregel dat ik de manpages van het betreffende platform / release pak, omdat er soms kleine verschillen inzitten.

Voor het grove werk is het verder inderdaad prima bruikbaar.
Pagina: 1