Exportera environment-variabel från C/C++

Här pratar vi programmering i dessa olika former. Perl, C/C++, Pascal, ADA, Lisp, COBOL, ZX Basic och mm.
Post Reply
User avatar
panzar
Posts: 100
Joined: 23 April 2003, 22:07

Exportera environment-variabel från C/C++

Post by panzar » 17 July 2004, 19:12

Hej!

Jag skulle villja exportera en envrionment-variabel från C/C++.
Alla de funktioner jag hittat hittils har skapat ett "eget" shell och skapat variabeln där, variabeln har alltså inte varit tillgänglig efter man stängt ner programmet.
De funktioner jag försökt med är: setenv(), putenv(), system().

Någon som har nåt hett tips?

User avatar
danne89
Posts: 457
Joined: 24 December 2002, 12:38

Post by danne89 » 17 July 2004, 21:49

Det är setenv() som ska användas. Dock har jag för mig att föräldrens envirom inte påverkas. Tror du bara kan på verka den för dina barn. Är inte helt säker.

User avatar
panzar
Posts: 100
Joined: 23 April 2003, 22:07

Post by panzar » 18 July 2004, 00:08

danne89 wrote:Det är setenv() som ska användas. Dock har jag för mig att föräldrens envirom inte påverkas.
Det är det som är problemet. Jag vill nämligen exportera variabeln http_proxy från mitt program och jag vill ju självklart att variabeln ska finnas kvar efter jag stängt ner programmet (annars är det ju ingen mening med att sätta en proxy).

Fler tips?

User avatar
drbrno
Posts: 2834
Joined: 6 October 2002, 05:01
Location: Lund
Contact:

Post by drbrno » 18 July 2004, 11:06

I vilket sammanhang används ditt program? Det kan finnas knep du kan använda. Kort sagt måste du låta föräldern snappa upp ändringarna och själv ändra sin miljö.

User avatar
li
Posts: 1125
Joined: 17 April 2003, 13:38
Location: Stockholm

Post by li » 18 July 2004, 11:56

Du kan väl alltid uppdatera en fil. Eller mer avancerat: kommunicera via pipes.
gentoo 3.0
arch 3.0
freeBSD 8.2
qemu/minix3
win/xp

User avatar
panzar
Posts: 100
Joined: 23 April 2003, 22:07

Post by panzar » 18 July 2004, 12:16

drbrno wrote:I vilket sammanhang används ditt program? Det kan finnas knep du kan använda. Kort sagt måste du låta föräldern snappa upp ändringarna och själv ändra sin miljö.
Mitt program är skrivet i Qt, tyvärr finns det inga klasser/funktioner som åstadkommer det jag vill i Qt heller. Det finns en klass som heter QSettings, men där går det heller inte att skapa några varaktiga environment variablar.

li: Ok, skulle du kunna utveckla det där lite mer?

User avatar
li
Posts: 1125
Joined: 17 April 2003, 13:38
Location: Stockholm

Post by li » 18 July 2004, 13:26

panzar wrote:li: Ok, skulle du kunna utveckla det där lite mer?
Nu kör jag, tyvärr widowwsz, så jag kan inte testa. Men frågan är om du inte kan starta programmet meed kommandot "source". Då kör man inom samma shell. Alternativt skapa en script-fil i programmet (med "export" av miljövariabel). Starta sriptet sedan med "source". Det finns även c-rutiner för att skriva till pipes....
gentoo 3.0
arch 3.0
freeBSD 8.2
qemu/minix3
win/xp

User avatar
danne89
Posts: 457
Joined: 24 December 2002, 12:38

Post by danne89 » 18 July 2004, 16:10

Jo skapa en skript-fil som du kör med exec låter vettigt. Alltså:
1. Skapa en fil med ett skript.
2. Forka processen
3. Execa filen.

User avatar
panzar
Posts: 100
Joined: 23 April 2003, 22:07

Post by panzar » 27 July 2004, 15:21

li wrote: Nu kör jag, tyvärr widowwsz, så jag kan inte testa. Men frågan är om du inte kan starta programmet meed kommandot "source". Då kör man inom samma shell. Alternativt skapa en script-fil i programmet (med "export" av miljövariabel). Starta sriptet sedan med "source". Det finns även c-rutiner för att skriva till pipes....
Jag försökte mig på ditt förslag.
Jag började med att skapa ett litet script för att exportera variablarna:

Code: Select all

#! /bin/bash

export ${1}=${2};

echo "$1 has the value of $2";
Sedan skapade jag ett litet program som anropade detta scriptet:

Code: Select all

#include <iostream>
using namespace std;

int main()
{
    int out = system("source export.sh TEST 10");
    cout << out << endl;
}
När jag sedan kör C++ programmet får jag den här outputen:
panzar@gentoop others $ ./test
TEST has the value 10
0
Men när jag försöker med "echo $TEST" från samma konsoll (efter programmet avslutats) så har $TEST inget värde - variabeln har alltså inte blivit exporterad.

Jag kanske missförstod era förslag, säg gärna till i sådana fall.

/Per.[/quote][/code]

Guest

Post by Guest » 27 July 2004, 16:57

Jag har stött på liknande, jag försöker få ett script att göra en export, men sedan när ett annat script kommer till finns det inte där!

User avatar
drbrno
Posts: 2834
Joined: 6 October 2002, 05:01
Location: Lund
Contact:

Post by drbrno » 27 July 2004, 20:23

Ditt C-program påverkar inte sin förälders miljö. Du måste få föräldern att göra ändringarna.

Guest

Post by Guest » 28 July 2004, 08:44

Är det möjligt med ett script, jag skulle vilja göra ett modulariserat script, hälst utan inblandning av filer som foo och bar

mikma
Posts: 3349
Joined: 10 July 2003, 21:19

Post by mikma » 28 July 2004, 10:47

Bjqrn wrote:Är det möjligt med ett script, jag skulle vilja göra ett modulariserat script, hälst utan inblandning av filer som foo och bar
Jag är inte säker på vad du är ute efter. Men om du vill att ett skript som exekvera av ett annat ska kunna överföra variabler till föräldern så finns det ett par lösningar.

Du kan t.ex. läsa in och exekverar det andra skriptet i samma skalomgivning med "source filnamn" (alt. ". filnamn"). Ett annat alternativ som används av bl.a. ssh-agent är att skriva ut kommandon på standard output som sedan evalueras av skalet för att sätta variablerna.

t.ex.

Code: Select all

# eval `skriptet.sh`
/Mikael

Guest

Post by Guest » 28 July 2004, 11:01

OK Tack, source blir nog det jag använder.

User avatar
panzar
Posts: 100
Joined: 23 April 2003, 22:07

Post by panzar » 28 July 2004, 21:40

mikma wrote: Jag är inte säker på vad du är ute efter. Men om du vill att ett skript som exekvera av ett annat ska kunna överföra variabler till föräldern så finns det ett par lösningar.
Mm, det är exakt vad jag vill göra - men jag vet inte riktigt hur jag ska bära mig åt (se mitt försök i föregående inlägg).
mikma wrote: Du kan t.ex. läsa in och exekverar det andra skriptet i samma skalomgivning med "source filnamn" (alt. ". filnamn").
Ok, kan du visa något exempel på det här eller förklara lite mer?

Tack,
Per.

mikma
Posts: 3349
Joined: 10 July 2003, 21:19

Post by mikma » 29 July 2004, 11:18

panzar wrote:
mikma wrote: Jag är inte säker på vad du är ute efter. Men om du vill att ett skript som exekvera av ett annat ska kunna överföra variabler till föräldern så finns det ett par lösningar.
Mm, det är exakt vad jag vill göra - men jag vet inte riktigt hur jag ska bära mig åt (se mitt försök i föregående inlägg).
mikma wrote: Du kan t.ex. läsa in och exekverar det andra skriptet i samma skalomgivning med "source filnamn" (alt. ". filnamn").
Ok, kan du visa något exempel på det här eller förklara lite mer?

Tack,
Per.
Source är ett inbyggt kommando i bash som du kan få lite information om med "help source".

Jag hittade ett exempel som använde source: http://www-106.ibm.com/developerworks/l ... bash3.html.

Enligt ditt inledande inlägg så ville du dock exportera variablerna från ett C/C++-program. Då kan du inte använda "source", det fungerar endast för att i ett skript läsa in och exekvera ett skript i samma skal.

/Mikael

Post Reply