#include <stdlib.h>
int system (const char * comand);
Позволяет выполнить заданную инструкцию в командном интерепретаторе. Это действие можно рассматривать как запуск процесса и ожидание его завершения. Дейтвие функции равносильно действию строки:
/bin/sh –c comand
Можно реализовать это действие, не используя функцию system:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int my_system (const char * cmd) {
int status;
pid_t pid;
pid = fork();
if (pid == -1) exit(-1);
else
if (pid == 0) {
const char * argv[4];
argv[0] = “sh”;
argv[1] = “-c”;
argv[2] = “cmd”;
argv[3] = “NULL”;
execv (“/bin/sh”,argv);
exit (-1);
}
if (waitpid (pid, &status, 0) == -1) exit (-1);
else
if (WIFEXITED(status)) exit(WEXITSTATUS(status));
exit (0);
}
В отличие от system здесь не блокируются никакие сигналы.
Основные параметры, передаваемые процессу
1) идентификатор самого процесса и идентификатор родительского процесса.
2) идентификатор пользователя и группы (владение процессом). Имеется понятие реального и действительного (эффективного) идентификаторов для пользователя и группы. Под реальным понимается идентификатор, который запускал процесс, а под действительным (эффективным) – идентификатор пользователя, который использовался при проверке прав доступа процесса к ресурсу.
В большинстве случаев реальный и эффективный идентификаторы – это одно и то же.
Имеется набор системных вызовов, позволяющих установить реальный и эффективный идентификаторы пользователя и группы:
#include <unistd.h>
#include <sys/types.h>
uid_t geteuid(void); // эффективный
gid_t getegid(void); // эффективный
uid_t getuid(void); // реальный
gid_t getgid(void); // реальный
3) Сеанс пользователей – показывает, кто из пользователей подключен к системе и работает с процессом.