Здавалка
Главная | Обратная связь

Возвращаемое значение



При нормальном выполнении функции возвращают 0. При ошибках выполнения функции возвращают -1 и устанавливают errno

 

Текст программы fork1.c:

/*$cat fork1.c*/

#include <stdio.h>

 

main()

{

int pid;

printf("I`m the original process with pid %d and ppid %d\n", getpid(), getppid());

pid = fork();

if (pid!=0)

{

printf("I'm the parent process with pid %d and ppid %d\n", getpid(), getppid());

printf("my child's pid is %d\n", pid);

}

else

{/* esli pid==0, this is child process*/

printf("I'm the child process with pid %d and ppid %d\n", getpid(), getppid());

}

printf("pid %d terminates.\n", getpid());

}

Выполнение программы fork1.exe:

'$ps'

PID TTY TIME COMD

638 term/tty014 0:01 sh

1260 term/tty014 0:05 ps

$fork1

I'm the original process with pid 1265 and ppid 638

I'm the parent process with pid 1265 and ppid 638

my child's pid is 1266

pid 1265 terminates.

I'm the child process with pid 1266 and ppid 1265

pid 1266 terminates.

 

Описание работы программы fork1.exe:

Вводится переменная целого типа pid. Запуск программы fork1.exe имеет свой номер PID 1265 и родительский номер PPID 638 (номер процесса работы shell), что и прописывается на дисплее.

Далее системным вызовом fork() происходит создание нового процесса, а точнее дублирование существующего процесса под номером 1265, таким образом переменной pid присваивается значение дочернего процесса 0 и 1266. Таким образом, у нас получается два параллельно идущих процесса - родительский и дочерний.

Сначала проходить ветвь условного оператора при значении условия - ложь, т.е. значение PID=0, показывается надпись о дочернем процессе и он завершается.

Далее проходить ветвь условного оператора при значении условия - истина, т.е.значение РID=1266, и показывается надпись родительском процессе и его завершении.

 

Текст программы fork2.c:

/*$cat fork2.с*/

#include <stdio.h>

main()

{

int pid;

printf("I`m the original process with %d and ppid %d\n", getpid(), getppid());

pid = fork();

if(pid!=0)

{

printf("I`m the parent process with pid %d and ppid %d\n", getpid(), getppid());

printf("My child's pid is %d\n", pid);}

else

{/*esli pid==0, this is child process*/

sleep(5);

printf("I'm the child process with pid %d and ppid %d\n", getpid(), getppid());

printf("\n was deserted");

}

printf("\n pid %d terminates\n", getpid());

}

 

Выполнение программы fork2.exe:

‘$ps’

PID TTY TIME COMD

638 term/tty014 0:01 sh

1387 term/tty014 0:05 ps

 

'$fork2’

I'm the original process with pid 1395 and ppid 638

I'm the parent process with pid 1395 and ppid 638

My child's pid is 1396

 

pid 1395 terminates

I'm the child process with pid 1396 and ppid 1

Was deserted

pid 1396 terminates.

Описание работы программы fork2.exe:

Вводится переменная целого типа pid. Запуск программы fork2.exe имеет свой номер PID 1395 и родительский номер РРГО 638 (номер процесса работы shell), что и прописывается на дисплее.

Далее системным вызовом fork() происходит создание нового дочернего процесса, а точнее дублирование существующего процесса под номером 1395, таким образом, переменной pid присваивается значение дочернего 1396 и родительского процесса 0. Соответственно, у нас тоже получается два параллельно работающих процесса.

Но т.к. в процессе выполнения программы включается функция sleep(5), которая осуществляет засыпание дочернего процесса на некоторое время и осуществляется работа условного оператора при значении условия - истина, т.е. PID=1396, далее показывается надпись о родительском процессе, который завершает свою работу.

Проходит работа оператора sleep(5), дочерний процесс оживает и продолжает идти по телу цикла. Но т.к. родительский процесс уже заверил свою работу, то его родителем становится процесс инициализации (init). Далее дочерний процесс завершает свою работу.

Текст программы myexec.c:

/*$cat myexec.с*/

#include <stdio.h>

 

main()

{

printf("I'm process of main program %d and I'm about to exec an ls -l\n", getpid());

execl("/bin/ls", "ls", "-l", NULL);

printf("this is line should be never executed\n");

}

Выполнение программы myexec.c:

‘$myexec'

"I'm process of main program 1456 and I'm about to exec an ls –l

Описание работы программы mуехес.c:

В процессе выполнения программы процесс программы под номером PID=1456 заменяется на новый процесс, указанный в функции ехес(). Таким образом, происходит создание нового процесса.

Синтаксис:

exec("const char*path, char*argl, ...char*argN, NULL) - сначала указывается путь, откуда берется значение аргумента, далее берегся значение аргумента.

Текст программы redirect.c:

/* $cat redirect.c */

#include <stdio.h>

#include <fcntl.h>

 

//int argc;

//char *argv[2];

main (argc,argv) //аргументы командной строки

int argc;

char *argv[2];

{

int fd; //файловый дескриптор (номер файла, с которым происходит работа в программе, используемой ОС)

fd = open(argv[1],O_CREAT|O_WRONLY|O_TRUNC);

dup2(fd,1);

close(fd);

execvp(argv[2], &argv[2]);

perror("main");

}

 

Выполнение программы redirect.c:

‘$redirect fff who'

'$cat fff'

User term/tty010 Jan 00:09

Описание работы программы redirect.c:

В программе происходит создание файла пользователем (если файла нет) или дополняет

файл(если файл существует), а затем перенаправление системного вызова, в нашем

примере - это системный вызов who, а файл называется fff. В программе используется

команда open, которая создает файл при помощи макросов:

O_CREAT - создать, если не существует,

O_TRUNC - сократить (truncate) существующий,

O_WRONLY - только запись,

Далее происходит дублирование в файл при помощи команды dup(). т.к. используя указанный файловый дескриптор fd. мы связали команды. Далее закрываем файл. А затем при помощи команды execvp() мы создаем процесс п добавляем его в файл.

open(<имя файла>,<режим открытия>,<права доступа к файлу>) - функция открытия файла, возвращает целое число, именуемое пользовательский дескриптор файла.

dup(<дескриптор файла, копируемый функцией>) - функция копирует дескриптор файла в первое свободное место в таблице пользовательских дескрипторов, возвращая новый дескриптор пользователю.

close(<файловый дескриптор открытого файла>) процесс закрывает открытый файл, когда процессу больше не нужно обращаться к файлу.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.