PID con C/C++

modena

Hola, me gustaria saber si podrian decirme como conseguir con C, averiguar el Process ID de un proceso en ejecucion.

Tengo hecho un programa que me habre un programa tantas veces como yo le pido, y tengo un problema, porque quiero que dicho programa en C, tambien lo cierre. Por ahora solo lo he intentado mediante el PID. Se como averiguar el ID manualmente, pero no que lo averigue C, y que lo utilize el automaticamente para cerrar el proceso, sin que yo tenga que darle el PID.

El comando que me falla es:

sprintf (ejecuta, "taskkill /PID %d", pid)

El PID lo se averiguar yo, pero como cada vez es uno distinto, necesito que el programa lo averigue y lo asigne a la variable "pid" para asi poder cerrarlo.

Muchas gracias.

PD: He llegado a hacer, que este programa, vuelque en un .txt todos los procesos y su PID mediante "system("tasklist");" pero no se como filtrar lla informacion para que solo coja el PID de "iexplore.exe" (Proceso que es el que quiero que habra, y cierre)

Dod-Evers

Hombre, en C puedes crear un hijo con un fork y ya ahí te devuelve el pid del hijo. Mira cosas de esas de los fork que son muy divers (¬¬). xD

PD: Qué tiempos de 2º de carrera..

modena

Estoy en grado superior y hace 2 semanas que doy C asi que no tengo mucha idea xD

PD: Podrias explicarme un opco eso de los fork? o decirme donde puedo mirarlo?. Gracias :)

Dod-Evers

Pos googlea un poco. Lo que te interesa del fork ahora mismo es que dado un programa que le has dado tu, no sé cualquier cosa, puedes crear una cosa que se llama hijo, y ese hijo lo creas mediante el fork.
http://www.programatium.com/manuales/c/21.htm#SECTION002130000000000000000

Es lo primero que he visto.

Con el fork, creas como 2 ramas y si en el hijo le haces un execl (o una de sus variantes) puedes ejecutar otros procesos.

modena

Pero yo lo que quiero es que cierre ese proceso.

Mira, yo tengo un programa que le das un numero N y te abre firefox o iexplore tantas veces como N le has dicho.

La cuestion es que ahora esos firefox, o esos iexplore los cierre. Lo estoy intentando con el PID, hay alguna manera mas facil que complicarse tanto?
Me refiero no podria acerse system("close iexplore.exe"); y punto? me refiero algo asi de facil y no tan lioso xD

PD: Creo que esa web me sera de mucha utilidad :)

Dod-Evers

No es tan lioso, porque cada vez que haces un fork tienes el PID. No me acuerdo muy bien cómo iba eso de saber si eres el hijo o el padre pero era facilito. Luego ya con ese pid puedes hacer un kill -pid.

(veo que programas en win, io taba acostumbrado a hacer esas warrerias españolas en unix).

modena

No esque programe en win, esque un dia me raye con un host ke pedia nose cuantas visitas al dia y dije bua pos yasta ago un programa que habra el firefox 500 veces y yasta xD y no es en si lo del host sino que ahora por mis cojones tengo que conseguir hacer el programa, el host me da= pero aora mismo (llevando 2 semanas con C) mi profesor se esta quedando flipado. Me ha dicho que si lo consigo que le diga como (dice que no tiene ni puta idea de como conseguir cerrar un programa ni el ni el profesor de sistemas) y que si lo consigo me suben la nota los 2 profesores xDDDD. Y a parte siempre que me e propuesto algo lo e conseguido y esta vez no va a ser menos :P

cabron

No existe ninguna forma de coger el ID de un proceso con ANSI C, debes usar una extensión del sistema operativo.

Lo que te están diciendo de fork, solo tira en sistemas UNIX.

No sé como tendrías que hacelo en Windows, pero vamos, sí te puedo asegurar que no hay ninguna función de C para hacerlo diretamente, tendrás que usar WinApi, o ejecutar algún comando especifico de Windows mediante system()

Dod-Evers

ah pues ya está xD
Mira, la estructura es padre - hijo1 - hijoN (o muchos hijos, o nietos xD).

En el hijo1 abres N exploradores y en el hijoN, como tienes el PID del padre, puedes hacer el execl("taskkill /PID &d",pid).

Alguna cosa así te podrá funcionar. Es un "juego" entre forks, execs y PID's.

modena

Pero una cosa, como asigno el valor del PID al "pid" variable? soz pero me e perdido :(
Otra cosa, execl en que libreria de C esta? para ponerla en el include :)

El programa que tengo es este :

#include<stdio.h>
#include<stdlib.h>

int main(){


int cont=1, n, pid;
char ejecuta[50];

printf("-------------\n");
printf("Impresion web|\n");
printf("-------------\n\n");
printf("1 - Introduce la pagina que quieres visitar, como tu pagina de inicio en Firefox\n\n");

printf("2 - Numero de impresiones solicitadas:");
scanf("%d", &n);

while(cont<=n){
             system("firefox.exe");
             cont++;
             }

getchar();
getchar();    

}

Este es el que tengo aqui en casa, pero en clase tengo el que esta mucho mas modificado ya con los datos PID etc, pero desde este como seria? donde introduzco el comando aqui?

PD: El de clase lo tengo para que solo abra un iexplore.exe par ano liarme, mi preferencia ahora es saber como cerrar el proceso, no que abra N ventanas, mientras sepa cerrar 1 las demas ya sera mas facil ;)

Thx.

Dod-Evers

podrías ir creando un hijo por cada firefox que abras, pero vamos, según lo que ha dicho cabron no se debe poder hacer bien en win...

modena

:(

Como se pueden filtrar los datos de un .txt, en el que tengo todos los PID de todos los procesos en ejecucion?
He hecho (en el programa de clase) que se ejecute el comando "system("tasklist");" y lo escriba todo en un .txt, ahora como puedo aislar la linea en que aparece IEXPLORE.EXE seguido de su PID y que recoja ese PID y se lo asigne a la variable "pid"? De ese modo ya lo tendria todo solucionado.

Dod-Evers

Bueno pues supongo que tendrá un patrón estilo "Cadena PID Memoria" entonces puedes abrir el fichero e ir leyendo esos bloques:
scanf(file, &string);scanf(file, &Pid); snanf(file, &mem); y luego lees caracter de fin de linea.

Alguna cosa así.

javithelong

#12 poquito a poco y con buena letra, vas leyendo lineas del fichero y parseandolo todo hasta tener el pid... (que locura ^^)

modena

YA te digo si es una locura... pero mira si es descabellado que ma dicho el profesor que no lo sabe hacer ni el y que si lo consigo me sube la nota 1 punto en la media xD

elkaoD

#15, tu profesor es pr0 programando

LOc0

Rebuscando en mi disco duro...


#include <windows.h>
#include <stdio.h>
#include <psapi.h>

void PrintProcessNameAndID( DWORD );

int main()
{
//Conseguimos la lista de PIDs.

DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    return;

//Calculamos cuántos PIDs hay.

cProcesses = cbNeeded / sizeof(DWORD);

//Imprimimos el nombre y el PID de cada proceso.

for ( i = 0; i < cProcesses; i++ )
    if( aProcesses[i] != 0 )
        PrintProcessNameAndID( aProcesses[i] );
       
return 0;

}

void PrintProcessNameAndID( DWORD processID )
{
char szProcessName[MAX_PATH] = "(Desconocido)";

//Conseguimos un handle del proceso
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );

//Conseguimos el nombre del proceso.
if (hProcess != NULL )
{
    HMODULE hMod;
    DWORD cbNeeded;

    if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
         &cbNeeded) )
    {
        GetModuleBaseName( hProcess, hMod, szProcessName,
                           sizeof(szProcessName)/sizeof(CHAR) );
    }
}

//Imprimimos el nombre del proceso y su PID.
printf("\n%s  (PID: %u)\n", szProcessName, processID );

CloseHandle( hProcess );

}
[/i]

Este código muestra la lista de procesos y su PID. No es muy difícil a partir de él, cada vez que lances firefox, llames a la función, busques el PID del nuevo firefox.exe y lo guardes en alguna estructura de datos (un int[] por ejemplo).

Salu2 ;)

SeiYa

taskkill /IM proceso.exe

Cyph3r

Alguien sabe donde puedo encontrar alguna web donde salgan la mayoría de funciones que incluye la librería windows.h ?

Es que me gustaría saber alguna función para controlar el volumen del sonido.

Muchas gracias.

Gnos1s

#12

En bash sería:

cat fichero.txt | tr -s " " | cut -f (nº columna de PID) -d " " | grep -v PID | sort -n > procesos.txt

Así te saldrían en una columna en el fichero procesos.txt, ordenados de menos a más, pero claro, hablo de una terminal en linux...

LOc0

#19
http://winapi.conclase.net/curso/index.php

y cómo no la mastodóntica

http://msdn2.microsoft.com/es-es/library/default.aspx

Salu2 ;)

modena

El programa terminado, ha quedado así:


#include<stdio.h>
#include<stdlib.h>

int main(){

int num, cont=0, pid;
char ejecuta[50],letra, repetir;
FILE *fichero;

printf("-------------\n");
printf("Impresion web|\n");
printf("-------------\n\n");
printf("Introduce la pagina que quieres visitar N veces, como tu pagina de inicio en Firefox\n\n");

do{
   printf("\n\nNumero de Impresiones Web deseadas: ");
   scanf("%d", &num);

   for(cont=1; cont<=num; cont++){
                                  system("firefox.exe");
                                  }                    
   printf("\n");
   system("pause");
   system("tasklist > PID.txt");

   fichero = fopen ("PID.txt", "r");

   if(fichero==0) printf("\nError de apertura del fichero");
   letra=getc(fichero);

   while (feof(fichero)==0){
                            putchar(letra);
                            letra=getc(fichero);
                            }
   fclose(fichero);
   printf("\n\nIntroduce el ProcessID para terminar: ");
   scanf("%d", &pid);

   sprintf(ejecuta, "taskkill /PID %d", pid);
   system(ejecuta);

   printf("Repetir proceso?? s/n: ");
   scanf(" %c", &repetir);
   
   }while(repetir!='n');

}
[/i]

Mas o menos, es lo que quería :)

Usuarios habituales

  • modena
  • LOc0
  • Gnos1s
  • Cyph3r
  • elkaoD
  • Dod-Evers
  • cabron