Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » STARTED alla ps

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.11.2004, 15:45 Uhr
~mikegast
Gast


Hi!
Ich suche eine Funktion, welche mir die vergangene Zeit seit "Prozesserzeugung" zurückgibt. Gleich wie in ps STARTED (Uhrzeit)
Die Funktion times wäre schon i.o. nur bräcuhte ich eine Funktion, der ich eine pid übergeben kann. T.B.
zeit(4327)
gibt mir 34 Sekunden zurück

Danke im Voraus,
mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.11.2004, 17:31 Uhr
virtual
Sexiest Bit alive
(Operator)


man 5 proc

Besonders interessant ist dann der Abschnitt zum Thema stat...
(vorsicht: die Zeitangeben werdne in jiffies (== 0.01 Sekunden) gerechnet.)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.11.2004, 17:39 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Danke für die Antwort. Leider geht das mit proc nur unter Linux - in BSD gibts das gar nicht. Ich versuche es grade mit times - aber das gibt mir komische Werte zurück. Mal schaun, ob ich da ein vernüftiges ergebnis bekomme

mfg

Edit: Das mit times war mein Fehler. Da muss man ja durch die _SC_CLK_TCK dividieren
--

Dieser Post wurde am 23.11.2004 um 17:43 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.11.2004, 17:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Ansonsten probier doch mal

Code:
strace ps -f


um herauszubekommen, was ps so macht, oder gleich den Source mal anschauen,,,
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.11.2004, 17:43 Uhr
mike
Pinguinhüpfer
(Operator)


Hmm. strace kennt er loider nicht
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.11.2004, 17:48 Uhr
virtual
Sexiest Bit alive
(Operator)


Geht denn truss?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.11.2004, 17:49 Uhr
virtual
Sexiest Bit alive
(Operator)


... der entsprechende BSD Systemcall heißt ptrace, vielleicht heisst das Programm dann auch so?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.11.2004, 18:05 Uhr
mike
Pinguinhüpfer
(Operator)


Leider kennt er weder truce noch ptrace
Ich hab das jetzt mit times versucht und habe nun das Problem des Jahrhunderts

C++:
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/times.h>
#include <unistd.h>

#define CHILDS 10

#define CHILD_KILLED 1
#define CHILD_ALIVE  2
#define CHILD_UDEF   3

typedef struct
{
  pid_t pid;
  int status;
  clock_t tmstart;
} chld_t;

time_t today;
chld_t chld[10];

int exit_status(int status)
{
  if(WIFEXITED(status))
    printf("--> Normal Termination; exit-status=%d\n", WEXITSTATUS(status));
  else if(WIFSIGNALED(status))
    printf("--> Abnormal Termination; Signalnumber=%d\n", WTERMSIG(status));
}

void init(void)
{
  int i;
  puts("Initialize Array ...");
  for(i=0; i<CHILDS; i++) {
    chld[i].pid =    -1;
    chld[i].status = CHILD_UDEF;
  }
}
void scheduler(void)
{
  puts("Scheduler started ...");
  double clk;
  if((clk = sysconf(CLK_TCK)) < 0)
    fprintf(stderr, "error sysconf");

  int i;
  struct tms tmp;
  while(1) {
    for(i=0; i<CHILDS; i++) {
      printf("-----> %d %6.2f secs\n", chld[i].pid, (times(&tmp)-chld[i].tmstart)/clk);
    }
    sleep(0.5);
  }
}

/***** CHILDS ******/
pid_t dirty(void)
{
  pid_t pid;
  time(&today);
  if((pid=fork()) < 0)
    fprintf(stderr, "error: fork");
  else if(pid == 0) {
    printf("%d started - class dirty - %s", getpid(), ctime(&today));
    while(1); /* waste cpu time*/
    exit(0);  /* never reached */
  }

  return pid;
}

pid_t goodone(void)
{
  pid_t pid;
  time(&today);
  if((pid=fork()) < 0)
    fprintf(stderr, "error: fork");
  else if(pid == 0) {
    printf("%d started - class good - %s", getpid(), ctime(&today));
    sleep(3);
    exit(0); /* sleeping for 3secs and exit */
  }
  
  return pid;
}

/*******************/

int main(void)
{
  srand(time(NULL));
  int i,j;

  pid_t sch;
  if((sch=fork()) < 0)
    fprintf(stderr,"Scheduler error");
  else if(sch == 0) {
    init();
    scheduler();
  }

  pid_t pid[CHILDS], pid_end[CHILDS];
  struct tms tmp;
  for(i=0; i<CHILDS; i++) {    
    if(rand()%2)
      pid[i]=dirty();
    else
      pid[i]=goodone();

    chld[i].pid =     pid[i];
    chld[i].status =  CHILD_ALIVE;
    chld[i].tmstart = times(&tmp);
    sleep(rand()%3); /* sleep for 0,1 or 2 seconds*/
  }

  int status;
  for(i=1; i<=CHILDS; i++) {
    pid_end[i] = wait(&status);
    exit_status(status);
  }
  
  puts("I have been waiting for all processes ...");

  for(i=1; i<=CHILDS; i++)
    for(j=1; j<=CHILDS; j++)
      if(pid_end[i] == pid[j])
        printf("child %d ends normal\n");

  if(waitpid(sch, NULL, 0) == -1)
    fprintf(stderr, "Wait Scheduler error");

  exit(0);
}


Die Funktion void scheduler(void) - Zeitberechnung - kann natürlich nicht funtzen, weil das Kind ja wieder ein eigenes Array im Speicher erzeugt. Weißt du zufällig wie ich das Array des Parent nutzen kann? Muss man das was mit dem IPC machen?

Mein Programm: Mein Programm hat 2 Funktionen goodone(void) und dirty(void). Die Funktionen werden nach Zufall zu unterschiedlichen Zeiten erzeugt. Die Aufgabe wäre es nun, allen Programmen die länger als 5sec laufen (alle dirty Funktionen) ein Quit Signal zu schicken - das soll scheduler(void) machen.

Danke,
mfg michael
--

Dieser Post wurde am 23.11.2004 um 18:09 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.11.2004, 23:09 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, ich denke du musst wohl IPC nutzen... Ich weiß nicht, ob BSD den clone Call unterstützt, eine alternative zum fork, welche nicht neuen Speicher fürs Child besorgt (letztlich basiert die Pthread-Inplementierung unter Linux auf diesem call).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.11.2004, 08:41 Uhr
~mikegast
Gast


Hi!
clone geht nicht - ich versuche es mal mit pipes oder IPCs

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: