[linux/C] achterhalen van pid van pipe

Pagina: 1
Acties:

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

int main()
{
FILE *infp,*outfp;
int c,i,pid,pid2,t;

if (( infp=popen("pppd /dev/ttyS1","r")) == NULL)
{
    perror("popen");
    exit(1);      
}

if (( outfp=fopen("pppd.txt","w")) == NULL)
{
    perror("fopen");
    exit(1);      
}

while( (c=getc(infp)) !=EOF )
{
    fprintf(outfp,"%c",c);
}
pid=getpid(infp);
pid2=getpid(outfp);
i=pclose(infp);
fclose(outfp);
printf("\npid: (%d) pid2: (%d) close (%d)\n",pid,pid2,i);
return 0;   
}

Mijn problemen zijn als volgt :)
• pid=pid2=programma pid (klopt helemaal) maar ik wil de pid hebben van die pppd die ik gestart heb. Hoe kom ik daaraan?
• i=pclose(infp); Dit zou de return waarde moeten afvangen maar deze is altijd 0 ?? Het uitvoeren enz lukt gewoon

Doet iets met Cloud (MS/IBM)


  • ewasx
  • Registratie: Augustus 2000
  • Laatst online: 16-11-2025
* i=pclose(infp); Dit zou de return waarde moeten afvangen maar deze is altijd 0 ?? Het uitvoeren enz lukt gewoon
Ik denk dat het probleem hier is dat pppd zich onmiddelijk fork()-ed en daardoor is het "programma" wat je gestart hebt alweer beindigd direct nadat het gestart is. Het probleem is op te lossen als je ervoor zorgt dat pppd niet uit zichzelf forke()-ed (optie nodetatch). popen zelf maakt al een fork dus die van ppp is dubbelop en overbodig. Ik denk dat je andere probleem ook opgelost is als je pppd zelf niet laat forken.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
als ik -d -detach toevoeg is i nu 2560
maar dat is nog de pid nog een return waarde van pppd (die loopt 0<x<20)

Doet iets met Cloud (MS/IBM)


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Dennis toch, vooruit dan omdat je het zo lief vraagt:
P&W -> NOS

  • ewasx
  • Registratie: Augustus 2000
  • Laatst online: 16-11-2025
Waarom moet dit nou ik godsnaam in NOS ipv programming? Dit is toch duidelijk een programmeer vraag? Er staat zelfs c code bij. Ik liep me helemaal rot te zoeken om hem terug te vinden. Je kan ook overdrijven met het in de juiste catogorie plaatsen van de vragen.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
Op donderdag 03 januari 2002 15:09 schreef ewasx het volgende:
Waarom moet dit nou ik godsnaam in NOS ipv programming? Dit is toch duidelijk een programmeer vraag? Er staat zelfs c code bij. Ik liep me helemaal rot te zoeken om hem terug te vinden. Je kan ook overdrijven met het in de juiste catogorie plaatsen van de vragen.
op mijn verzoek
is nogal OS specifiek dit

Doet iets met Cloud (MS/IBM)


  • ewasx
  • Registratie: Augustus 2000
  • Laatst online: 16-11-2025
is nogal OS specifiek dit
Sja, maar dat zijn al die vragen over VC++/MFC ook. Terwijl men daar nog vaak gewoon als topic "C++" bij zet alsof MFC bij de STL hoort ofzo. Maargoed, ik zal ophouden met zeiken.

Terug naar het probleem.

Ik denk dat je wat beter moet kijken naar hoe je pppd moet gebruiken. Zowieso had ik een typefout gemaakt en moet het nodetach zijn (zonder t, sorry). Maar dus geen -detach. Probeer je commando eerst op de commandline uit voordat je het vanuit je programma probeert te runnen.

Verwijderd

Laat maar in NOS, ik kom te weinig in P&W om dit dan te lezen....
Op donderdag 03 januari 2002 09:25 schreef D2k het volgende:
pid=getpid(infp);
pid2=getpid(outfp);
[/code]
• pid=pid2=programma pid (klopt helemaal) maar ik wil de pid hebben van die pppd die ik gestart heb. Hoe kom ik daaraan?
Probleem is dat je d.n.v. popen() niet de pid kan achterhalen, daarvoor moet je de applicatie zelf fork()en.... popen() is te simpel daarvoor, maar dat is dus ook de kracht van popen() :)

getpid() geeft de pid van je eigen applicatie, niet van de child die je met popen() geopent hebt. getpid() neemt ook geen argument aan (zie /usr/include/unistd.h)

Simpele manier om dit te doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* Code partly stolen from Linux Video Studio (http://ronald.bitfreak.net)
 * Copyright (C) 2000-2001 Ronald Bultje
 * All code is licensed under the GPL
 */

#include <stdio.h>
#include <errno.h>

int fd_p2c, fd_c2p; /* parent-to-child and child-to-parent */
int pid;
int active = 0; /* is the child active or not */

int kill_child()
{
  if (active)
  {
    kill(pid, SIGINT);
    waitpid(pid, NULL, 0);
    active = 0;
    return 0;
  }
  else
  {
    printf("Child is not active\n");
    return -1;
  }
}

int write_child(char *msg)
{
  if (!active)
  {
    printf("Child is not active\n");
    return -1;
  }
  if (write(fd_p2c, msg, strlen(msg)) != strlen(msg))
  {
    printf("write() failed: %s\n",
    sys_errlist[errno]);
    return -1;
  }
  return 0;
}

int read_child(char *buff)
{
  char input[256];
  int n;

  if (!active)
  {
    printf("Child is not active\n");
    return -1;
  }

  n = read(fd_c2p, input, sizeof(input)-1);

  if (n<0) /* no output */
  {
    printf("read() failed: %s\n",
    sys_errlist[errno]);
    return -1;
  }
  else if (n==0) /* child is dead */
  {
    kill_child();
    close(fd_p2c);
    close(fd_c2p);
    return -1;
  }
  else /* we have output */
  {
    strcpy(buff, input); /* make sure buff is big enough! */
    return 0;
  }
}

int create_child()
{
  int ipipe[2], opipe[2];
  char *command[3];

  if (active)
  {
    printf("Close old child first!\n");
    return -1;
  }

  command[0] = "pppd";
  command[1] = "/dev/ttyS1";
  command[2] = NULL;

  if (pipe(ipipe) || pipe(opipe))
  {
    printf("pipe() failed: %s\n",
    sys_errlist[errno]);
    return -1;
  }
  if ((pid = fork()) < 0)
  {
    printf("fork() failed: %s\n",
    sys_errlist[errno]);
    return -1;
  }

  active = 1;

  if (pid) /* parent */
  {
    fd_c2p = opipe[0]; /* to read from child */
    fcntl(fd_c2p, F_SETFL, O_NONBLOCK);
    close(opipe[1]);

    fd_p2c = ipipe[1]; /* to write to child */
    close(ipipe[0]);
  }
  else /* child */
  {
    close(ipipe[1]);
    close(opipe[0]);

    /* set stdin to our fd_p2c */
    if (dup2(ipipe[0], 0) != 0)
    exit(1);
    close(ipipe[0]);

    /* set stdout/stderr to fd_c2p */
    if (dup2(opipe[1], 1) != 1)
    exit(1);
    if (dup2(opipe[1], 2) != 2)
    exit(1);
    close(opipe[1]);

    /* execute command */
    execvp(command[0], command);
    exit(1);
  }

  return 0;
}

Met Gtk (gdk_input_add()) kun je alle read() functies automatiseren met callbacks etc. KDE/Qt zal daar ook wel een functie voor hebben...
code:
1
i=pclose(infp);


• i=pclose(infp); Dit zou de return waarde moeten afvangen maar deze is altijd 0 ?? Het uitvoeren enz lukt gewoon
pclose() geeft 0 als return value omdat dat gelukt is, denk ik :)

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
tnx ik ga morgen als ik weer bij mijn linux bak er ff naar kijken
ik werd gek van het zoeken naar een pid en fork(),pipe(),popen(),exec(),system() enz enz

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
Op donderdag 03 januari 2002 15:41 schreef ewasx het volgende:

[..]

Sja, maar dat zijn al die vragen over VC++/MFC ook. Terwijl men daar nog vaak gewoon als topic "C++" bij zet alsof MFC bij de STL hoort ofzo. Maargoed, ik zal ophouden met zeiken.
ben het niet met je eens ;)
maar heb ook geen zin in de discussie hier
die voeren we maar een keer in /14
Terug naar het probleem.

Ik denk dat je wat beter moet kijken naar hoe je pppd moet gebruiken. Zowieso had ik een typefout gemaakt en moet het nodetach zijn (zonder t, sorry). Maar dus geen -detach.
mag allebei
Probeer je commando eerst op de commandline uit voordat je het vanuit je programma probeert te runnen.
die stap heb ik al gehad :)
het probleem zit um echt in het bedienen van het eea in C

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
Op donderdag 03 januari 2002 16:15 schreef beelzebubu het volgende:
Laat maar in NOS, ik kom te weinig in P&W om dit dan te lezen....
[..]

Probleem is dat je d.n.v. popen() niet de pid kan achterhalen, daarvoor moet je de applicatie zelf fork()en.... popen() is te simpel daarvoor, maar dat is dus ook de kracht van popen() :)
das een beetje jammer
getpid() geeft de pid van je eigen applicatie, niet van de child die je met popen() geopent hebt. getpid() neemt ook geen argument aan (zie /usr/include/unistd.h)
weet ik... maar je probeert wel eens wat ;)
Simpele manier om dit te doen:
..code..
Met Gtk (gdk_input_add()) kun je alle read() functies automatiseren met callbacks etc. KDE/Qt zal daar ook wel een functie voor hebben...
het moet portable worden naar een embedded systeem. Probeer het dus bij standaard C/C++ te houden
tnx iig voor de code (waar vind ik F_SETFL en O_NONBLOCK? ik zoek gewoon ff verder)
pclose() geeft 0 als return value omdat dat gelukt is, denk ik :)
tja daar dacht ik ook al aan
maar nu is het telkens 2560 :?
ach een nieuwe dag een nieuwe ronde
maar eens kijken wat jou code gaat brengen

Doet iets met Cloud (MS/IBM)


Verwijderd

Op vrijdag 04 januari 2002 08:46 schreef D2k het volgende:
tnx iig voor de code (waar vind ik F_SETFL en O_NONBLOCK? ik zoek gewoon ff verder)
fcntl.h

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
Op vrijdag 04 januari 2002 10:25 schreef beelzebubu het volgende:

[..]

fcntl.h
al gevonden. toch bedankt :)
Ik zit nu alleen te kijken hoe ik het eea aan moet roepen

in main()
int test;
test=create_child();
en dan:?
kan ik er dan de rest van die functies op loslaten?

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25
ik heb inmiddels de oplossing gevonden zie de code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//afvangen returnwaarde pppd werkend
#include <sys/types.h>  /* include this before any other sys headers */
#include <sys/wait.h>   /* header for waitpid() and various macros */
#include <signal.h>     /* header for signal functions */
#include <stdio.h>  /* header for fprintf() */
#include <unistd.h>     /* header for fork() */
#include <stdlib.h>
void sig_chld(int);     /* prototype for our SIGCHLD handler */

int main() 
{
    struct sigaction act;
    pid_t pid;
    char *test[20];
    test[0] = "pppd";
    test[1] = "/dev/ttyS1";
    test[2] = "-d";
    test[3] = "-detach";
    test[4] = NULL;
    act.sa_handler = sig_chld;
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_NOCLDSTOP;
    if (sigaction(SIGCHLD, &act, NULL) < 0) 
    {
      fprintf(stderr, "sigaction failed\n");
      return 1;
    }

    switch (pid = fork())
    {
    case -1:
      fprintf(stderr, "fork failed\n");
      return 1;

    case 0:              /* child -- finish straight away */
        execvp(test [0], test);
          _exit(7);      /* exit status = 7 */

    default:                /* parent */
        sleep(50);          /* give child time to finish */

    }

    return 0;
}

void sig_chld(int signo) 
{
    int status, child_val;
    if (waitpid(-1, &status, WNOHANG) < 0) 
    {
      fprintf(stderr, "waitpid failed\n");
      return;
    }
    if (WIFEXITED(status))          /* did child exit normally? */
    {
      child_val = WEXITSTATUS(status); /* get child's exit status */
      printf("child's exited normally with status %d\n", child_val);
    }
}

hopelijk heeft iemand er ooit nog iets aan :)

Doet iets met Cloud (MS/IBM)


Verwijderd

Op vrijdag 04 januari 2002 10:41 schreef D2k het volgende:

[..]

al gevonden. toch bedankt :)
Ik zit nu alleen te kijken hoe ik het eea aan moet roepen

in main()
int test;
test=create_child();
en dan:?
kan ik er dan de rest van die functies op loslaten?
Nog ff ter volledigheid, ja :)
Pagina: 1