Вот как я бы это сделал:
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
'
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
Если вы не хотите читать из '/ 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 . Если у вас есть собственный системный вызов, вы можете вызывать его из своей программы пользовательского пространства.
Единственный способ сделать это без чтения / proc - это вызвать «ps aux», просмотреть каждую строку, прочитать второй столбец (PID) и вызвать lsof -p [PID] с ним.
... Я бы посоветовал прочитать / proc;)
PS и все остальные инструменты (ЗА ИСКЛЮЧЕНИЕМ модулей ядра) читаются из / proc
. / proc
- это специальная файловая система, созданная ядром на лету, чтобы процессы пользовательского режима могли читать данные, которые в противном случае были бы доступны только для ядра.
Поэтому рекомендуется читать из / proc
.
Вы можете быстро интуитивно взглянуть на файловую систему / proc
, чтобы увидеть, как она структурирована.
Для каждого процесса существует / proc / pid
, где pid - это номер идентификатора процесса. Внутри этой папки есть несколько файлов, которые содержат разные данные о текущем процессе.
Если вы запустите
strace ps -aux
, вы увидите, как программа ps
считывает эти данные из / proc
.
Если вы этого не сделаете, то я думаю, какой бы API вы ни использовали, в конечном итоге он прочитает файловую систему / proc. Вот несколько примеров программы, выполняющей это:
Но, к сожалению, это не API.
Чтение 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); } }