/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Process kontrol
Fra : Martin Ehmsen


Dato : 15-11-01 17:07

Hej...

Jeg har den hensigt at lave et GUI til et tekstbaseret program under
linux. Altså et lag som ligger sig over programmet, hvor
kommunikationen mellem bruger og program sker gennem GUI'en.
Her bliver jeg altså nødt til at kunne modtage output fra programmet og
sende input ind i programmet.

Jeg kan starte en proces og få den kørt (fx. ls), med følgende kode:
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define SHELL "/bin/sh"

main() {
my_system( "ls" );
}

int my_system (const char *command) {
int status;
pid_t pid;

pid = fork();
if (pid == 0)
{
execl (SHELL, SHELL, "-c", command, NULL);
_exit (EXIT_FAILURE);
}
else if (pid < 0)
status = -1;
else
if (waitpid (pid, &status, 0) != pid)
status = -1;
return status;
}

Men hvordan får jeg lige gang i input/output til det underliggende
program??

Mvh.
Martin Ehmsen
--
"Life is good for only two things,
discovering mathematics and teaching mathematics"
Siméon Poisson

 
 
Kent Friis (15-11-2001)
Kommentar
Fra : Kent Friis


Dato : 15-11-01 17:31

Den Thu, 15 Nov 2001 17:06:30 +0100 skrev Martin Ehmsen:
>Hej...
>
>Jeg har den hensigt at lave et GUI til et tekstbaseret program under
>linux. Altså et lag som ligger sig over programmet, hvor
>kommunikationen mellem bruger og program sker gennem GUI'en.
>Her bliver jeg altså nødt til at kunne modtage output fra programmet og
>sende input ind i programmet.
>
>Men hvordan får jeg lige gang i input/output til det underliggende
>program??

Hvis det er et kommando-linie program, som fx. tar, giver du det bare
de rigtige parametre.

Hvis det er noget halv-interaktivt, så kig på pipe(2).

Hvis det er fx. en "vi" eller emacs, så skal du kigge på /dev/pty*
og/eller /dev/pts - men det er IKKE for begyndere.

Mvh
Kent
--
Det skete i de dage i november engang
at de første kataloger satte hyggen igang

Martin Ehmsen (15-11-2001)
Kommentar
Fra : Martin Ehmsen


Dato : 15-11-01 17:39

Kent Friis wrote:
> Hvis det er et kommando-linie program, som fx. tar, giver du det bare
> de rigtige parametre.
>
> Hvis det er noget halv-interaktivt, så kig på pipe(2).

Det er pipe jeg har brug for.
Jeg har netop fundet et fedt site om ovenstående:
http://www.cs.cf.ac.uk/Dave/C/

> Hvis det er fx. en "vi" eller emacs, så skal du kigge på /dev/pty*
> og/eller /dev/pts - men det er IKKE for begyndere.

Det er faktisk sftp og jeg er godt klar over det ikke er for begyndere.
Jeg syntes bare, man må tage skridtet og forsøge ellers lærer man
aldrig noget.

Tak for hjælpen...
Martin Ehmsen
--
"Life is good for only two things,
discovering mathematics and teaching mathematics"
Siméon Poisson

Kent Friis (15-11-2001)
Kommentar
Fra : Kent Friis


Dato : 15-11-01 17:57

Den Thu, 15 Nov 2001 17:39:14 +0100 skrev Martin Ehmsen:
>Kent Friis wrote:
>> Hvis det er et kommando-linie program, som fx. tar, giver du det bare
>> de rigtige parametre.
>>
>> Hvis det er noget halv-interaktivt, så kig på pipe(2).
>
>Det er pipe jeg har brug for.
>Jeg har netop fundet et fedt site om ovenstående:
>http://www.cs.cf.ac.uk/Dave/C/
>
>> Hvis det er fx. en "vi" eller emacs, så skal du kigge på /dev/pty*
>> og/eller /dev/pts - men det er IKKE for begyndere.
>
>Det er faktisk sftp og jeg er godt klar over det ikke er for begyndere.
>Jeg syntes bare, man må tage skridtet og forsøge ellers lærer man
>aldrig noget.

Var det ikke nemmere at bruge scp?

Mvh
Kent
--
Det skete i de dage i november engang
at de første kataloger satte hyggen igang

Martin Ehmsen (15-11-2001)
Kommentar
Fra : Martin Ehmsen


Dato : 15-11-01 18:34

Kent Friis wrote:
>>Det er faktisk sftp og jeg er godt klar over det ikke er for
begyndere.
>>Jeg syntes bare, man må tage skridtet og forsøge ellers lærer man
>>aldrig noget.
>
> Var det ikke nemmere at bruge scp?

Jeg synes det er lidt hip som hap. Hvorfor ville du bruge scp??

Martin Ehmsen
--
"Life is good for only two things,
discovering mathematics and teaching mathematics"
Siméon Poisson

Kent Friis (15-11-2001)
Kommentar
Fra : Kent Friis


Dato : 15-11-01 19:07

Den Thu, 15 Nov 2001 18:34:17 +0100 skrev Martin Ehmsen:
>Kent Friis wrote:
>>>Det er faktisk sftp og jeg er godt klar over det ikke er for
>begyndere.
>>>Jeg syntes bare, man må tage skridtet og forsøge ellers lærer man
>>>aldrig noget.
>>
>> Var det ikke nemmere at bruge scp?
>
>Jeg synes det er lidt hip som hap. Hvorfor ville du bruge scp??

Fordi den kan klare det hele på kommandolinien. Altså sparer du besværet
med pipes m.v.

Mvh
Kent
--
Det skete i de dage i november engang
at de første kataloger satte hyggen igang

Byrial Jensen (18-11-2001)
Kommentar
Fra : Byrial Jensen


Dato : 18-11-01 12:29

Martin Ehmsen <thames@get2net.dk> skrev:
> Hej...
>
> Jeg har den hensigt at lave et GUI til et tekstbaseret program under
> linux. Altså et lag som ligger sig over programmet, hvor
> kommunikationen mellem bruger og program sker gennem GUI'en.
> Her bliver jeg altså nødt til at kunne modtage output fra programmet og
> sende input ind i programmet.
>
> Jeg kan starte en proces og få den kørt (fx. ls), med følgende kode:

[klip]

> Men hvordan får jeg lige gang i input/output til det underliggende
> program??

Lav 3 rør (med pipe(2)) før du kalder fork().

Før du udfører exec*() i den nye process, skal du lukke de originale
stdin, stdout og stderr filehandles (med de numeriske værdier 0, 1
og 2), og i stedet bruge rørene. Flyt den ende som barneprocessen
skal bruge på plads med dup2(2), og luk den anden ende.

Du kan se et eksempel som jeg skrevet i programmerne pospell og
newsbody. Se <URL: http://home.worldonline.dk/~byrial/spellutils/>.

Det interessante kode er i "exec.c"

Anders Melchiorsen (19-11-2001)
Kommentar
Fra : Anders Melchiorsen


Dato : 19-11-01 23:08

Byrial Jensen <bjensen@nospam.dk> skrev den 18-Nov-01:

> Lav 3 rør (med pipe(2)) før du kalder fork().

Hvis A og B er forbundet med to pipes,

A --0-> B
A <-1-- B

hvordan sikrer man sig så at de samtidige kald

A: write(0, mem, stor);
B: write(1, mem, stor);

ikke hænger fordi begge processer venter på at den anden proces får
tømt pipen (hvis buffer antages at være mindre end værdien af "stor") ?

--
Regards, Anders

....if a Microsoft product fails, who do you sue?

Byrial Jensen (21-11-2001)
Kommentar
Fra : Byrial Jensen


Dato : 21-11-01 20:13

Anders Melchiorsen <anders@kalibalik.dk> skrev:
> Byrial Jensen <bjensen@nospam.dk> skrev den 18-Nov-01:
>
>> Lav 3 rør (med pipe(2)) før du kalder fork().
>
> Hvis A og B er forbundet med to pipes,
>
> A --0-> B
> A <-1-- B
>
> hvordan sikrer man sig så at de samtidige kald
>
> A: write(0, mem, stor);
> B: write(1, mem, stor);
>
> ikke hænger fordi begge processer venter på at den anden proces får
> tømt pipen (hvis buffer antages at være mindre end værdien af "stor") ?

Godt spørgsmål. Antagelsen om at "stor" er større end bufferstørrelsen,
er næppe en nødvendig betingelse for en baglås-situation. Det må være
nok at den samlede mængde data i alle write-kald til et rør er større.

Jeg kan ikke umiddelbart se en god løsning udover at gøre rørene
ikke-blokerende med fcntl(2):
fcntl(fd, F_SETFL, O_NONBLOCK)

Bufferstørrelsen er i øvrigt garanteret af Posix til mindst 512 byte.
Den aktuelle værdi kan aflæses med:
fpathconf(fd, _PC_PIPE_BUF)

Det her har vist mere at gøre med Unix end C-programmering, så jeg
krydsposter med opfølgning dk.edb.system.unix.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste