#include <stdlib.h>
#include <stdio.h>
int main() {
printf("Running ps with system\n");
system("ps ax");
printf("Done \n");
exit(0);
}
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΠ΅ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ system1.Ρ, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²ΡΠ²ΠΎΠ΄, ΠΏΠΎΡ ΠΎΠΆΠΈΠΉ Π½Π° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π΄Π°Π»Π΅Π΅:
$ ./system1
Running ps with system
PID TTY STAT TIME COMMAND
1 ? Ss 0:03 init [5]
...
1262 pts/1 Ss 0:00 /bin/bash
1273 pts/2 S 0:00 su -
1274 pts/2 S+ 0:00 -bash
1463 pts/2 SN 0:00 oclock
1465 pts/1 S 0:01 emacs Makefile
1480 pts/1 S+ 0:00 ./system1
1481 pts/1 R+ 0:00 ps ax
Done.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ system ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π½ΡΠΆΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ Π΅Π΅ Π² ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ°ΠΉΠ»Π΅ system1.Ρ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
system("ps Π°Ρ &");
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΠ΅ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΡ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄:
$ ./system2
Running ps with system
PID TTY STAT TIME COMMAND
1 ? S 0:03 init [5]
...
Done.
$ 1274 pts/2 3+ 0:00 -bash
1463 pts/2 SN 0:00 oclock
1465 pts/1 S 0:01 emacs Makefile
1484 pts/1 R 0:00 ps ax
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ system ΡΠΎ ΡΡΡΠΎΠΊΠΎΠΉ "ps Π°Ρ ", Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ps. ΠΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ps Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π²ΡΠ·ΠΎΠ² system Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ system ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, Π½ΠΎ ΠΎΠ½Π° ΡΠΎΠΆΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Π° ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ, Π½Π°ΡΠ°ΡΡΠΉ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ system, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ Π·Π°Π΄Π°Ρ.
ΠΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ system Π²Π΅ΡΠ½Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ Π·Π°ΠΏΡΠΎΡ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° Π²Π΅ΡΠ½Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ps, ΡΠΎΠ²Π½ΠΎ ΡΠΎ ΠΆΠ΅, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ Π±Ρ ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ Π² ΡΡΡΠΎΠΊΡ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
$ ps Π°Ρ &
ΠΠ°Π»Π΅Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° system2 Π²ΡΠ²ΠΎΠ΄ΠΈΡ Done. ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ps ΠΏΠΎΡΠ²ΠΈΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π²Π΅ΡΡ ΡΠ²ΠΎΠΉ Π²ΡΠ²ΠΎΠ΄. ΠΡΠ²ΠΎΠ΄ ps ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ system2 ΠΈ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠΏΠΈΡΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ system2. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ±ΠΈΡΡ Ρ ΡΠΎΠ»ΠΊΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠΌΠ΅Π»ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΡΡΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, exec.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠΎΠΎΠ±ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ system β Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ. ΠΠ½ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ Π²Π΄Π²ΠΎΠΉΠ½Π΅: ΠΈ ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ°, ΠΈ ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΈΠ»ΡΠ½ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌ ΠΎΡ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄Π°ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅ΠΉ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²Π° system.
ΠΠ°ΠΌΠ΅Π½Π° ΠΎΠ±ΡΠ°Π·Π° ΠΏΡΠΎΡΠ΅ΡΡΠ°
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ΅Π»ΠΎΠ΅ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΠ΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ exec. ΠΠ½ΠΈ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π€ΡΠ½ΠΊΡΠΈΡ exec Π·Π°ΠΌΠ΅ΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½ΠΎΠ²ΡΠΌ, Π·Π°Π΄Π°Π½Π½ΡΠΌ Π² Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅ path ΠΈΠ»ΠΈ file. Π€ΡΠ½ΠΊΡΠΈΠΈ exec ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΎΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ. Π€ΡΠ½ΠΊΡΠΈΠΈ exec Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ system, Ρ.ΠΊ. ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
#include <unistd.h>
char **environ;
int execl(const char *path, const char *arg0, ..., (char *)0);
int execlp(const char *file, const char *arg0, ..., (char *)0);
int execle(const char *path, const char *arg0, ..., (char *)0,
char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π΅Π»ΡΡΡΡ Π½Π° Π΄Π²Π° Π²ΠΈΠ΄Π°. execl, execlp ΠΈ execle ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠΈΡ ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ null. Π£ execv ΠΈ execvp Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΠΎΠΊ. Π ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π½ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΡΠ°ΡΡΡΠ΅Ρ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ argv, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ main.
ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ execve, Ρ ΠΎΡΡ Π½Π΅Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Π½Π° ΡΡΠΎΡ ΡΡΠ΅Ρ.
Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΡΡΡΠΈΠΊΡ p, ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΈΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ PATH Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠ»ΠΈ ΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΉΡΠΈ Π½ΡΠΆΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, Π²ΠΊΠ»ΡΡΠ°ΡΡΠ΅Π΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ.
ΠΠ΅ΡΠ΅Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ environ. ΠΡΡΠ³ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π² ΡΡΠ½ΠΊΡΠΈΡΡ execle ΠΈ execve, ΡΠΏΠΎΡΠΎΠ±Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΡΡΠΎΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΊΠ°ΠΊ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ exec Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ps, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ±ΠΈΡΠ°ΡΡ Π»ΡΠ±ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° exec, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π²ΡΠ·ΠΎΠ²Π°Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π°Π»Π΅Π΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:
#include <unistd.h>
/* ΠΡΠΈΠΌΠ΅Ρ ΡΠΏΠΈΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² */
/* Π£ΡΡΠΈΡΠ΅, ΡΡΠΎ Π΄Π»Ρ argv[0] Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
char *const ps_argv[] = {"ps", "ax", 0};
/* He ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ */
char *const ps_envp[] = {"PATH=/bin:/usr/bin", "TERM=console", 0};
/* ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΉ exec */
execl("/bin/ps", "ps", "ax", 0);
/* ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ps Π² /bin */
execlp("ps", "ps", "ax", 0);
/* ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ /bin Π² PATH */
execle("/bin/ps", "ps", "ax", 0, ps_envp);
/* ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ²ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ */
execv("/bin/ps", ps_argv);
execvp("ps", ps_argv);
execve("/bin/ps", ps_argv, ps_envp);
Π ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.2.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.2. Π€ΡΠ½ΠΊΡΠΈΡ execlpΠΠ°Π²Π°ΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ² execlp:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Running ps with execlp\n");
execlp("ps", "ps", "ax", 0);
printf("Done.\n");
exit(0);
}
ΠΠΎΠ³Π΄Π° Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ΅Ρ Π΅Ρ.Ρ, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΠ±ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ps, Π½ΠΎ Π±Π΅Π· ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Done. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π² Π²ΡΠ²ΠΎΠ΄Π΅ Π½Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠ΅Ρ Π΅Ρ:
$ ./ΡΠ΅Ρ Π΅Ρ
Running ps with execlp
PID TTY STAT TIME COMMAND
1 ? S 0:03 init [5]
...
1262 pts/1 Ss 0:00 /bin/bash
1273 pts/2 S 0:00 su -
1274 pts/2 S+ 0:00 -bash
1463 pts/1 SN 0:00 oclock
1465 pts/1 S 0:01 emacs Makefile
1514 pts/1 R+ 0:00 ps ax
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ execlp, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠ΅Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ, Π·Π°Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ PATH Π΄Π»Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ps. ΠΠ°Π»Π΅Π΅ ΠΎΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ΅Ρ Π΅Ρ, Π·Π°ΠΏΡΡΡΠΈΠ² Π΅Π΅ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ Π²Ρ Π²Π²Π΅Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ
$ ps ax
ΠΠΎΠ³Π΄Π° ps Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ. ΠΠΎΠ·Π²ΡΠ°ΡΠ° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ΅Ρ Π΅Ρ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠΎΡΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ. PID Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠΎΡ ΠΆΠ΅, ΡΡΠΎ ΠΈ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ, ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΎ PID ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ nice. Π ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΠΏΡΡΡΠΈΠ»Π° Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ΄ ΠΈ Π½ΠΎΠ²ΡΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ», Π·Π°Π΄Π°Π½Π½ΡΠΉ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ exec.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΏΠΈΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ exec. ΠΠ½ΠΎ Π·Π°Π΄Π°Π΅ΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ARG_MAX ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Linux ΡΠ°Π²Π½ΠΎ 128 ΠΠ±Π°ΠΉΡ. Π Π΄ΡΡΠ³ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π΄Π°Π²Π°ΡΡΡΡ ΠΌΠ΅Π½ΡΡΠΈΠΉ ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ, ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π‘ΡΠ°Π½Π΄Π°ΡΡ POSIX Π³Π»Π°ΡΠΈΡ, ΡΡΠΎ ARG_MAX Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 4096 Π±Π°ΠΉΡΠΎΠ².
Π€ΡΠ½ΠΊΡΠΈΠΈ exec, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°Π΄Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ errno ΠΈ ΡΡΠ½ΠΊΡΠΈΡ exec Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ -1.
ΠΠΎΠ²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ exec, Π½Π°ΡΠ»Π΅Π΄ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΎΡΠΊΡΡΡΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΠΎΡΡΠ°ΡΡΡΡ ΠΎΡΠΊΡΡΡΡΠΌΠΈ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅, ΠΏΠΎΠΊΠ° Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΈΡ ΡΠ»Π°Π³ FD_CLOEXEC (close on exec) (ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΌ. Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° fcntl Π² Π³Π»Π°Π²Π΅ 3). ΠΡΠ±ΡΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² Π·Π°ΠΊΡΡΠ²Π°ΡΡΡΡ.