GNU/Linux >> Belajar Linux >  >> Linux

Linux API untuk mendaftar proses yang sedang berjalan?

http://procps.sourceforge.net/

http://procps.cvs.sourceforge.net/viewvc/procps/procps/proc/readproc.c?view=markup

Apakah sumber ps dan alat proses lainnya. Mereka memang menggunakan proc (menunjukkan itu mungkin cara konvensional dan terbaik). Sumber mereka cukup mudah dibaca. File

/procps-3.2.8/proc/readproc.c

Semoga bermanfaat. Juga saran yang berguna seperti diposting oleh ephemient sedang menautkan ke API yang disediakan oleh libproc , yang seharusnya tersedia di repo Anda (atau menurut saya sudah terinstal) tetapi Anda memerlukan variasi "-dev" untuk header dan lainnya.

Semoga Sukses


Jika Anda tidak ingin membaca dari '/ proc. Kemudian Anda dapat mempertimbangkan untuk menulis modul Kernel yang akan mengimplementasikan panggilan sistem Anda sendiri. Dan panggilan sistem Anda harus ditulis sehingga dapat memperoleh daftar proses saat ini, seperti:

/* ProcessList.c 
    Robert Love Chapter 3
    */
    #include < linux/kernel.h >
    #include < linux/sched.h >
    #include < linux/module.h >

    int init_module(void) {
        struct task_struct *task;
        for_each_process(task) {
              printk("%s [%d]\n",task->comm , task->pid);
        }
        return 0;
    }
   
    void cleanup_module(void) {
        printk(KERN_INFO "Cleaning Up.\n");
    }

Kode di atas diambil dari artikel saya di sini di http://linuxgazette.net/133/saha.html. Setelah Anda memiliki panggilan sistem sendiri, Anda dapat memanggilnya dari program ruang pengguna Anda.


Ini dia (C/C++):

Anda dapat menemukannya di sini:http://ubuntuforums.org/showthread.php?t=657097

Pada dasarnya, apa yang dilakukannya adalah mengulang semua folder numerik di /proc/<pid> , lalu melakukan tautan baca pada /proc/<pid>/exe , atau jika Anda menginginkan argumen-baris-perintah cat /proc/<pid>/cmdline

Deskriptor file yang dibuka oleh proses ada di /proc/<pid>/fd/<descriptor> , dan Anda mendapatkan nama file dengan melakukan readlink pada setiap symlink, mis. readlink /proc/<pid>/fd/<descriptor> . fd dapat berupa perangkat, seperti /dev/null, soket, atau file, dan mungkin lebih banyak lagi.

#sertakan

ssize_t readlink(const char *path, char *buf, size_t bufsiz);
Jika berhasil, readlink() mengembalikan jumlah byte yang ditempatkan di buf.
Pada kesalahan, -1 dikembalikan dan errno disetel untuk menunjukkan kesalahan.

Omong-omong, ini sama dengan readproc.c melakukan (atau setidaknya melakukan).
Tentu saja, mudah-mudahan mereka melakukannya tanpa kemungkinan buffer overflow.

#ifndef __cplusplus
    #define _GNU_SOURCE
#endif

#include <unistd.h>
#include <dirent.h>
#include <sys/types.h> // for opendir(), readdir(), closedir()
#include <sys/stat.h> // for stat()

#ifdef __cplusplus
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdarg>
#else
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
#endif


#define PROC_DIRECTORY "/proc/"
#define CASE_SENSITIVE    1
#define CASE_INSENSITIVE  0
#define EXACT_MATCH       1
#define INEXACT_MATCH     0


int IsNumeric(const char* ccharptr_CharacterList)
{
    for ( ; *ccharptr_CharacterList; ccharptr_CharacterList++)
        if (*ccharptr_CharacterList < '0' || *ccharptr_CharacterList > '9')
            return 0; // false
    return 1; // true
}


int strcmp_Wrapper(const char *s1, const char *s2, int intCaseSensitive)
{
    if (intCaseSensitive)
        return !strcmp(s1, s2);
    else
        return !strcasecmp(s1, s2);
}

int strstr_Wrapper(const char* haystack, const char* needle, int intCaseSensitive)
{
    if (intCaseSensitive)
        return (int) strstr(haystack, needle);
    else
        return (int) strcasestr(haystack, needle);
}


#ifdef __cplusplus
pid_t GetPIDbyName(const char* cchrptr_ProcessName, int intCaseSensitiveness, int intExactMatch)
#else
pid_t GetPIDbyName_implements(const char* cchrptr_ProcessName, int intCaseSensitiveness, int intExactMatch)
#endif
{
    char chrarry_CommandLinePath[100]  ;
    char chrarry_NameOfProcess[300]  ;
    char* chrptr_StringToCompare = NULL ;
    pid_t pid_ProcessIdentifier = (pid_t) -1 ;
    struct dirent* de_DirEntity = NULL ;
    DIR* dir_proc = NULL ;

    int (*CompareFunction) (const char*, const char*, int) ;

    if (intExactMatch)
        CompareFunction = &strcmp_Wrapper;
    else
        CompareFunction = &strstr_Wrapper;


    dir_proc = opendir(PROC_DIRECTORY) ;
    if (dir_proc == NULL)
    {
        perror("Couldn't open the " PROC_DIRECTORY " directory") ;
        return (pid_t) -2 ;
    }

    // Loop while not NULL
    while ( (de_DirEntity = readdir(dir_proc)) )
    {
        if (de_DirEntity->d_type == DT_DIR)
        {
            if (IsNumeric(de_DirEntity->d_name))
            {
                strcpy(chrarry_CommandLinePath, PROC_DIRECTORY) ;
                strcat(chrarry_CommandLinePath, de_DirEntity->d_name) ;
                strcat(chrarry_CommandLinePath, "/cmdline") ;
                FILE* fd_CmdLineFile = fopen (chrarry_CommandLinePath, "rt") ;  // open the file for reading text
                if (fd_CmdLineFile)
                {
                    fscanf(fd_CmdLineFile, "%s", chrarry_NameOfProcess) ; // read from /proc/<NR>/cmdline
                    fclose(fd_CmdLineFile);  // close the file prior to exiting the routine

                    if (strrchr(chrarry_NameOfProcess, '/'))
                        chrptr_StringToCompare = strrchr(chrarry_NameOfProcess, '/') +1 ;
                    else
                        chrptr_StringToCompare = chrarry_NameOfProcess ;

                    //printf("Process name: %s\n", chrarry_NameOfProcess);
                    //printf("Pure Process name: %s\n", chrptr_StringToCompare );

                    if ( CompareFunction(chrptr_StringToCompare, cchrptr_ProcessName, intCaseSensitiveness) )
                    {
                        pid_ProcessIdentifier = (pid_t) atoi(de_DirEntity->d_name) ;
                        closedir(dir_proc) ;
                        return pid_ProcessIdentifier ;
                    }
                }
            }
        }
    }
    closedir(dir_proc) ;
    return pid_ProcessIdentifier ;
}

#ifdef __cplusplus
    pid_t GetPIDbyName(const char* cchrptr_ProcessName)
    {
        return GetPIDbyName(cchrptr_ProcessName, CASE_INSENSITIVE, EXACT_MATCH) ;
    }
#else
    // C cannot overload functions - fixed
    pid_t GetPIDbyName_Wrapper(const char* cchrptr_ProcessName, ... )
    {
        int intTempArgument ;
        int intInputArguments[2] ;
        // intInputArguments[0] = 0 ;
        // intInputArguments[1] = 0 ;
        memset(intInputArguments, 0, sizeof(intInputArguments) ) ;
        int intInputIndex ;
        va_list argptr;

        va_start( argptr, cchrptr_ProcessName );
            for (intInputIndex = 0;  (intTempArgument = va_arg( argptr, int )) != 15; ++intInputIndex)
            {
                intInputArguments[intInputIndex] = intTempArgument ;
            }
        va_end( argptr );
        return GetPIDbyName_implements(cchrptr_ProcessName, intInputArguments[0], intInputArguments[1]);
    }

    #define GetPIDbyName(ProcessName,...) GetPIDbyName_Wrapper(ProcessName, ##__VA_ARGS__, (int) 15)

#endif

int main()
{
    pid_t pid = GetPIDbyName("bash") ; // If -1 = not found, if -2 = proc fs access error
    printf("PID %d\n", pid);
    return EXIT_SUCCESS ;
}

Jika Anda tidak melakukannya, maka saya kira API apa pun yang akan Anda gunakan pada akhirnya akan membaca sistem file /proc. Berikut beberapa contoh program yang melakukan ini:

  • qps
  • htop
  • Proses

Namun sayangnya, itu bukan merupakan API.


Linux
  1. Perintah Linux ps

  2. Bagaimana cara mendaftar proses yang dilampirkan ke segmen memori bersama di linux?

  3. Apa proses Windows ini di Linux?

  1. Cara Mengatur Batasan pada Proses yang Berjalan Pengguna di Linux

  2. 3 Cara Mendaftar Pengguna di Linux

  3. Cara Membunuh Proses yang Berjalan di Linux

  1. Cara Mendaftar Proses yang Berjalan di Linux

  2. Perintah Linux ls - Daftar File

  3. Bagaimana cara menampilkan daftar proses yang berjalan Python?