API Linux для списка рабочих процессов?

Вот как я бы это сделал:

curl https://httpbin.org/post \
    -H 'content-type: multipart/form-data; boundary=----FormBoundary123456789' \
    --data-binary  

Или немного более изощренно (должно быть переносимо для большинства современных оболочек):

DELIM=----FormBoundary$RANDOM$RANDOM

curl https://httpbin.org/post \
    -H "content-type: multipart/form-data; boundary=$DELIM" \
    --data-binary --$DELIM\r
Content-Disposition: form-data; name="example"\r
\r
test\r
'--$DELIM--\r
'
------FormBoundary123456789\r Content-Disposition: form-data; name="example"\r \r test\r ------FormBoundary123456789--\r '

Или немного более изощренно (должно быть переносимо для большинства современных оболочек):

DELIM=----FormBoundary$RANDOM$RANDOM

curl https://httpbin.org/post \
    -H "content-type: multipart/form-data; boundary=$DELIM" \
    --data-binary --$DELIM\r
Content-Disposition: form-data; name="example"\r
\r
test\r
'--$DELIM--\r
'
49
задан John Topley 2 June 2009 в 03:37
поделиться

6 ответов

http://procps.sourceforge.net/

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

Is the source of ps and other process tools. They do indeed use proc (indicating it is probably the conventional and best way). Their source is quite readable. The file

/procps-3.2.8/proc/readproc.c

May be useful. Also a useful suggestion as posted by ephemient is linking to the API provided by libproc, which should be available in your repo (or already installed I would say) but you will need the "-dev" variation for the headers and what-not.

Good Luck

41
ответ дан 7 November 2019 в 11:40
поделиться

Если вы не хотите читать из '/ proc. Затем вы можете подумать о написании модуля ядра, который будет реализовывать ваш собственный системный вызов. И ваш системный вызов должен быть написан так, чтобы он мог получить список текущих процессов, например:

/* 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");
    }

Приведенный выше код взят из моей статьи здесь на http://linuxgazette.net/133/saha.html . Если у вас есть собственный системный вызов, вы можете вызывать его из своей программы пользовательского пространства.

24
ответ дан 7 November 2019 в 11:40
поделиться

Единственный способ сделать это без чтения / proc - это вызвать «ps aux», просмотреть каждую строку, прочитать второй столбец (PID) и вызвать lsof -p [PID] с ним.

... Я бы посоветовал прочитать / proc;)

4
ответ дан 7 November 2019 в 11:40
поделиться

PS и все остальные инструменты (ЗА ИСКЛЮЧЕНИЕМ модулей ядра) читаются из / proc . / proc - это специальная файловая система, созданная ядром на лету, чтобы процессы пользовательского режима могли читать данные, которые в противном случае были бы доступны только для ядра.

Поэтому рекомендуется читать из / proc .

Вы можете быстро интуитивно взглянуть на файловую систему / proc , чтобы увидеть, как она структурирована. Для каждого процесса существует / proc / pid , где pid - это номер идентификатора процесса. Внутри этой папки есть несколько файлов, которые содержат разные данные о текущем процессе. Если вы запустите

strace ps -aux

, вы увидите, как программа ps считывает эти данные из / proc .

5
ответ дан 7 November 2019 в 11:40
поделиться

Если вы этого не сделаете, то я думаю, какой бы API вы ни использовали, в конечном итоге он прочитает файловую систему / proc. Вот несколько примеров программы, выполняющей это:

Но, к сожалению, это не API.

8
ответ дан 7 November 2019 в 11:40
поделиться

Чтение Proc не так уж плохо. Я не могу показать вам в C ++, но следующий код D должен указывать в правильном направлении:

import std.stdio;
import std.string;
import std.file;
import std.regexp;
import std.c.linux.linux;

alias std.string.split explode;

string srex = "^/proc/[0-9]+$";
string trex = "State:[ \t][SR]";
RegExp rex;
RegExp rext;

   string[] scanPidDirs(string target)
   {
      string[] result;

      bool callback(DirEntry* de)
      {
         if (de.isdir)
         {
            if (rex.find(de.name) >= 0)
            {
                string[] a = explode(de.name, "/");
                string pid = a[a.length-1];
                string x = cast(string) std.file.read(de.name ~ "/status");
                int n = rext.find(x);
                if  (n >= 0)
                {
                    x = cast(string) std.file.read(de.name ~ "/cmdline");
                    // This is null terminated
                    if (x.length) x.length = x.length-1;
                    a = explode(x, "/");
                    if (a.length)
                       x = a[a.length-1];
                    else
                       x = "";
                     if  (x == target)
                    {
                        result ~= pid ~ "/" ~x;
                    }
                }
             }
          }
          return true;
      }

      listdir("/proc", &callback);
      return result.dup;
   }

void main(string[] args)
{
    rex= new RegExp(srex);
    rext= new RegExp(trex);
    string[] a = scanPidDirs(args[1]);
    if (!a.length)
    {
        writefln("Not found");
        return;
    }
    writefln("%d matching processes", a.length);
    foreach (s; a)
    {
       string[] p = explode(s, "/");
       int pid = atoi(p[0]);
       writef("Stop %s (%d)? ", s, pid);
       string r = readln();
       if (r == "Y\n" || r == "y\n")
          kill(pid, SIGUSR1);
    }
}
1
ответ дан 7 November 2019 в 11:40
поделиться