Системный вызов system

#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) Сеанс пользователей – показывает, кто из пользователей подключен к системе и работает с процессом.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: