[LinuxFocus-icon]
�����  |  �����  |  ������  |  �����

������� | ������ | ������ | ��� LF
��� �������� �������� �� ��������� ������: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  Polish  

[Leonardo]
����� Leonardo Giordani
<leo.giordani(at)libero.it>

�� ������:

������� ���������� ���������������� ���������� ���������������� ���������, �������� ������� ���������������, ������������ ����������������� (� �������� �� ���������� � C/C++). C 1999 ���� �������� ������������� � Linux/Unix.

������� �� �������:
Kolobynin Alexey <alexey_ak0(at)mail.ru>

����������:


 

������������ ���������������� - �������� � �������� � ��������

[run in paralell]

������:

���� ������� ����� ������ — ����������� �������� � �������� ��������������� � � �� ����������� � ������������ ������� Linux. ������� � ������������� ���� ����� ���������������, �� �������� ���������� ����������, ������� ���������������� �������������� ����� ���������� �� ��������, �� ������������ ���������. ��� ��������� ������ ��� �����:

��� ������ �� �������� man �������� � ������ ����� ����� �������. ��� ������� glibc ������� �� ��������� gnu info (info Libc, ��� ������� info:/libc/Top � konqueror).
_________________ _________________ _________________

 

��������

����� �� ���������� ������� � ������� ������������ ������ ���� ��������� ��������� ���������������������� — ������� ����������� ���������� ���������� �������� � ����� ����� ������� ������������� �������� �������. ���������� ���� ������� ������, �� ������� ������������ ����� ������������ ��������� �� ���������� ��������� ���������, ������������������, ������� ������, ������� � �.�. ��� ������ �������� ����������� ������������ �������. ��� �� ������ �����, ����������� ������ �������� — ���� ��������� ����� ������, ������� ����������� � ������ ������� ������ �� ����� ����������, ���� � ����� "����������� � �����" �����.  

������� ��������

��� ���������� ����������� ���������� �������� ���������� ���������� ������� ���������� ������������ �������. ����� �������� ���������� ����� ������������ �����������, ���������� ������� � ������ ������ � ����������� � ��� ���������� ������ ��� �� ����������.

����� ��� ��� �����������, ��� ���������� ������ ������ Linux, ����������� � ����������� �������������: ����� ���� ������������� ���������, � ������ ������ ������� ��� — ��� ����� ����������, �� ������� ��� �������, ������� ������ — ��� ����� �������� ������, ������� �� �������, ��������� ���������� — �������� ���������� ���������������, ����� ��� ����� ��� ������� ������ (����� ��������� ���������� ��� ����������).

��������� ������� ������������� ��������� ��� ������������ ����, ������� ������ � ��������� ����������. ���� � �����-�� ����� ������ ������ ��������� ��� ���������� � �������� �� �� ��� �� ����� ������ ������������� ���������, �� ���������� ��������� ����� ���������� � �����, ��� ��� ���� ����������� �����: ���������� ��� ��������� ���������� ��� ������ � ������ ���������, �� ������� ����� ��������� ����������� ���������� ��������. ������ ������� (��� ������) ������������ ��� ����������� ������������� ���������.

����������, ��� ���������� � �������, � ������� �� �������� �� ��������: � ������ ������ ������� ����������� ������ ���� ������ (���� ������ ���� ��������������, � �� �� ����� ������ ��� ���� ������������), � ������ ��������� ����� �� ����; ����� ������������� ���������� �������, ����������� �������, ������������� ������� ���������������, ��� ���������� ����������� � ���������� �� �� �� ���������� ������� ��������, ��� ��� ����� ����������� � ��������� ����� ������� � �.�. ��� ��, ��� �� �������� ����������������.

��� ���� �������� �� ��������, ��������������� ��������� ����� �������, ������� ������ �� ��� ������������, �������� ���������� �������� ������������� ��������� (����������). ��� �� �����, ��� ������ ���� ������ � ����������� ������ ������������ �������. ��������, ���� ��������� ����� ��������� ���� �� ����������� ������, ����� ���� � �������������� ��������� ������ ���� ���� Linux.  

�������� � Linux � Unix

������� ������ ���-��� � ���������, ������������� �� ����� ������. �������, ������� ���� ��� ������ ����������, ���������� ps(1) - ��� ���������� �� "process status" (����. — ��������� ��������). ������ ������� ��������� ������ � ����� ������� ps, �� ������� ���-�� �����

  PID TTY          TIME CMD
 2241 ttyp4    00:00:00 bash
 2346 ttyp4    00:00:00 ps

� �������, ��� ������ ������ �� ������, ������ ������� �� ������ ����� �����������: ps ����� ��� ������ ���������, ������������� �� ������� ���������. �� ����� � ��������� ������� ���, ��� ������ �������� ��� ������� ������� (�������� "mozilla" ��� �������� Mozilla ��� "gcc" ��� GNU Compiler Collection). "ps" ���������� � ���� ������, ��� ��� ��� ������� �����������, ����� ��������� ������ ������������� ���������. ������ ���������� ������� — ��� Bourne Again Shell — ��������, ���������� �� ���� ����������.

��������� (����) ���������� � �������� TIME � TTY � ���������� PID — Process IDentifier (����. — ������������� ��������). pid — ���������� ������������� �����, ������� ������������� ������� �������������� ��������. ���� ���������� �������� �����������, ��� pid ����� ���� ����������� ������, ������ �������������, ��� �� ����� ���������� ��������, ��� pid �������� ����������. �� ����� ����� �������, ��� �����, ������� ������ �� ��� ����� �������� ��� ���������� ps, ����� ���������� �� ������������ ����. ����� �������������, ��� � ������ ������, ������� ��� ���� ��������, �� �������� ������, � �������� ps: ������ ������� ������ ��� ��� �� ������ ���������, ������ � ������� �������� pid, ��� ��������������� � ���, ��� ��� ������ ��������, ���� ��������� ���� � �� ��.

�� ����� ����� �������� ������ ���� ���������, ���������� �� ����� ������: �������� man �������, ��� ���� -e ���������� "������� ��� ��������". ������ "ps -e" � ���������, � ps ������� ��� ������� ������, ����������������� ��� ����. ����� ��� ���� ������� ������������� ���� ������, ����� ������������� ����� � ���� ps.log:

ps -e > ps.log

������ �� ����� ���������� ���� ����, ������ ��� � ������� ��������� (��� ������ �������� less). ��� ���������� � ������ ������, ����� ������������� ��������� ������ ��� �� ����� �������. ������ �� �����, ��� ������ �������� �� ������ ��������, ���������� ���� (����� ��������� ������ ��� ����������� ��������), �� � ��������� ������, ��������� �� ������� ����� �������� �����. ���������� � ������ ��������� � ������ ������� �� ������������ ����� �������, ������ ���� ��������� ���������, �������������� �� ���� �������. ��-������, ��� ����������� �� ������������ ������� � pid ������ 1 — ��� ������ "init", ����������� ���� ���������. �� ����� ������ pid, ��� ��� ��� ������ �������, ����������� ������������ ��������. ����� �� ����� ����� �������� ������� ��������� ��������� � �������, ���������������� �� "d" — ��� ��� ���������� "������" — ���� �� ����� ������ ��������� � �������. �� � ������������ ������ init � ������� � ����� �� ��������� ������.  

��������������� � libc

������, ����� �� ����� ������������� � �������� � ��� ������ ���� � ����� ������������ �������, ������ ������ ������������� ���. �� �������� �������������� ���������� ��������� �� �������� � ����� ��������: ��� ������������ ����� ����� ������������� ���������� � �� �������������. �� ������ ��� ���������� ������� ���� �������: ��������� � ��������, ������ ��������� ����� ������ ����������� � ������� ������, ����������� �������. ����� ���������, � ��� ����� �����, ����� ������ ������ ���� ���������, ���������� �� ���� �����.

����������� ���������� C (libc, ������������� � Linux � glibc), ���������� ����������� ��������������� Unix System V. Unix System V (����� SysV) — ������������ ���������� Unix, ���������� ���� �� ���� ����� ������ ������� Unix, ������ — BSD Unix.

� libc ��� pid_t ��������� ��� �����, ��������� �������� � ���� pid. ������ �� ����� ������������ ���� ��� ��� ������ � pid, ������ ��� ����� ������ ��� �������: ������������� ������ ���� ���� �� ��� �� ���������.

���������� �������, ������� �������� ��� pid ��������, ����������� ���� ���������

pid_t getpid (void)

(��� ���������� ������ � pid_t � unistd.h � sys/types.h) � ������� ���������, ������� ������� � ����������� ����� ���� pid. ��� ������ ������ ��������� �������� ��������� ���

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

int main()
{
  pid_t pid;

  pid = getpid();
  printf("pid ����������� �������� - %d\n", pid);

  return 0;
}
��������� ��������� � print_pid.c � ������������� ��.
gcc -Wall -o print_pid print_pid.c
������� ������� ����������� ���� print_pid. � ���������, ��� ������� ���������� �� ���������� � path, ������� ���������� ��������� ��������� ��� "./print_pid". �������� ���������, �� �� ������� ������ �����������������: ��� ������� ��� ������������� �����, �, ���� ���������� ��������� ��, �� �������, ��� ��� ����� ����� ��������� ������������� �� �������; ���� ��� ����� ���� � �� ���, ������ ��� � �������� ����� ��������� ����� ���� ������ ������ �������. ����������, ��������, ��������� ps ����� ����� ��������� print_pid...

������ ����� �������� ��������� ��������, �� ������� � ����� ��������� ���� � ���, ��� � ���������������� ���������� ��� ����. ����� ��������� (������������ � �������� A) ������� ����� ������� (B), ��� ��� ���������, �� ���� � ��� ���������� ���, �� ������ ��������� ����������� ������� (������ ������� ��������) � ����� ���������� ��������� ����������. � ����� ������� ��� ����� ��������� ��������� ������� ����, ��������, � ����������� �� ����� ������������ ��� ��������� ������������ ������. ������� A — "������������ �������", � B — "��������". ������ �� ����� ����� ������ �������� "����������� ���� ���������", ������� �� ���� init. ��� �������, ������� ������� ����� �������

pid_t fork(void)
��� �� ������ ���������� ������������ ���������� ��������, ������ � ���������� �������� ������� (to fork, ����. — ���������). �����, ������� ��� ���������� — ��� pid, ������ ��� ���� �������� ��� �� ��� ��������. �� ��������, ��� ������� ������� ����������� � ������������ � ��������, ������� ����� �����������, ��������� � ������� �������������� ����������, ��������� ��������� ��������. ������ ����� ������� ����� ����������� ����� ����� �������� �����: ������������ ��� ��������? ��, ����� �����: ���� �� ����. �������, ����� ������� ������ �����������, ����������� ������ ������������ �������, ������� ���������� �������������, � ��� �� ��������� �� ��������, �������� ������� ������������ ��� ��������, ������� �� ���������, ����������� �� ������ ����������.

��� �� �� �� ����, �� ��� ����� ����� ����� ������� �����������, ��� ��� ��� � ��� ����������. ��� �������� �������� ����, ��� ��� ������������, ��� � ��� ��������, ������ ��� ��� ������ ��������� ������ ���� ����� �����. ����� ��������� ���, �������� �� ��������:

- ����������
- ���� �� �������� ������� ��������� (...)
- ���� �� ������������ ������� ��������� (...)
������� ������������ ����� ��� ����� ���������, ���������� �� ��������� ���������. ������� �����: ������� fork ���������� '0' � �������� ������� � pid ��������� �������� � ������������. ������� ���������� ������� ������������ pid � �����, � �� ����� �����, ����� ������� ��������� ���� ���. �� ����� C �� �������
int main()
{
  pid_t pid;

  pid = fork();
  if (pid == 0)
  {
    ��� ��������� ��������
  }
  ��� ������������� ��������
}
������ ������� ������ ��������� ������ �������������� ����: �� ������ ��������� ��� � ����� fork_demo.c � �������������� ��� �����. � �������� ������ ����� ������������� ��� �������. ��������� ������� ������������ � ��� ��������: ������������ � ��������, ������� ���-��� �� �����. � ���������� ��, ��� �� ������, ����� ������������ ���� ������� (���� ��� ����� ���������).
(01) #include <unistd.h>
(02) #include <sys/types.h>
(03) #include <stdio.h>

(04) int main()
(05) {
(05)   pid_t pid;
(06)   int i;

(07)   pid = fork();

(08)   if (pid == 0){
(09)     for (i = 0; i  < 8; i++){
(10)       printf("-��������-\n");
(11)     }
(12)     return(0);
(13)   }

(14)   for (i = 0; i < 8; i++){
(15)     printf("+������������+\n");
(16)   }

(17)   return(0);
(18) }

������ (01)—(03) �������� ��������� ������������ ������ ����������� ��������� (����������� ����/�����, ���������������).
������� main (��� ������ � GNU) ���������� �����, ������� ����� ����, ���� ��� ������ ��� ������ � ��� ������, ���� ���-�� ��������� �� ��. ������� ���� ����� �������, ��� ��� ����������� ��� ������ (�� ������� ��������� ������, ����� ������ �������� ����). �����, �� ���������� ���������� ��� pid (05) � ����� ��� �������� � ������. ���� ���� ����������, ��� ���������� �����, ���������, ������ ��� ��� ������� ���������� ��� �������.
� ������ (07) �� �������� ������� fork, ������� ��������� ���� � ���������, ������������� � �������� ��������, � pid ��������� �������� � ������������; �������� ������������ � ������ (08). ������ ��� ����� (09)—(13) ����� �������� � �������� ��������, � ���������� ��� (14)—(16) � ������������.
��� ����� ���� ������ ������� 8 ��� � ����������� ����� ����� "-��������-" ��� "+������������+" � ����������� �� ����, ����� ������� �����������, � ����� ��������� ����������, ��������� 0. ��������� ��-���������� �����, ��� ��� ��� ����� "return" �������� ������� ����� ���������� ����� ����� ��������� ����� ��� ������������� (����������, ��� �� �������� ����� ������, ������ ���������� ��, ���� �� �� �����). �������� ������ ����� ������ ����� ����������, ��� ��� ���������� ������������� �������� (�������� �������) ���� ��������� ���������� ��� ������ ����������, ���������� �� ��������� ������������ ������ ����������.

��������, �� ������ �� ������������� ����������� ���������: � �� ���� ����������, ��� ����������� ����� ����� �� ���� �����, ��� ������� �� �������� ���������� ������ ��������� �����. ��������, �� ������ �� �������� ������������������ ����� "+������������+", � ����� ����� "-��������-" ��� ��������. ����� ���������� ��� ��������� ��� ��������� ���������, ��������� ����� ����������.

�������� �������� ��������� ����� ����� ������ ������� prinf, �� ������ ��������� ������� ������ ���������������: �� ������� ��� ��� ������ ������� sleep � rand.

sleep(rand()%4)
��� �������� ��������� "�������" �� ��������� ����� ������: �� 0 �� 3 (% ���������� ������� �� �������������� �������). ������ ��� ��� �������� ���
(09)  for (i = 0; i < 8; i++){
(->)    sleep (rand()%4);
(10)    printf("-��������-\n");
(11)  }
�� �� ������� � � ����� ������������� ��������. �������� ��������� � fork_demo2.c, ������������ � �������� ��. ������ ��� ����������� ���������, ���� �� ������� ������� � ������� ������:
[leo@mobile ipc2]$ ./fork_demo2
-��������-
+������������+
+������������+
-��������-
-��������-
+������������+
+������������+
-��������-
-��������-
+������������+
+������������+
-��������-
-��������-
-��������-
+������������+
+������������+
[leo@mobile ipc2]$

������ ���������� ��������, ������� ������ ����� ���� ������: �� ����� ������� ��������� �������� ��������� ������� �������������, ��� ����� ��� ��������� ��������, �������� �� �������� ������������� ��������, �����������. ����� ������������� �������� ���������� ������������ ����������� � ��������� ��� ���� �� ������������������ � ����, ����� ��������� �������� � ������ �����. ������ ������ ������������� ��������� — ������� wait

pid_t waitpid (pid_t PID, int *STATUS_PTR, int OPTIONS)
��� PID — ��� PID ���������� ��������, STATUS_PTR — ��������� �� �����, ������� ����� ��������� ������ ��������� �������� (NULL, ���� ��� ���������� �� �����), � OPTIONS — ��� ����� �����, �� ������� �� ������ �� ����� �������� ��������. ��� ������ ���������, ��� ������������ ������� ������� �������� � ���� ��� ����������
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

int main()
{
  pid_t pid;
  int i;

  pid = fork();

  if (pid == 0){
    for (i = 0; i < 14; i++){
      sleep (rand()%4);
      printf("-��������-\n");
    }
    return 0;
  }

  sleep (rand()%4);
  printf("+������������+ ������ ���������� ���������� ��������� ��������...\n");
  waitpid (pid, NULL, 0);
  printf("+������������+ ...��������\n");

  return 0;
}
������� sleep ������� � ��� ������������� ��������, ����� ������� ���������� ���������� ���������� ���������. �������� ��� � fork_demo3.c, ������������ ��� � ��������. �� ������ ��� �������� ���� ������ ������������� ������������������ ����������!

� ��������� ������ �� ������ ������ � ������������� � �������������� ����� ����������. � ������ �������� ��������� ��������, ��������� ��������� �������, � �������� �� ���, ����� � ��� ������������ �� ��� ������������ ������� ������� � ������. ���������� ��� � .c ���� � �������������, � ��������� ��������� ���� � ��������� ���������, ���� ��� � ����� ����������� �����. ������ ����������!  

������������� � ���������

�� ������� �����

 

�������� �������

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ��������� :
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Leonardo Giordani, FDL
LinuxFocus.org
Translation information:
it --> -- : Leonardo Giordani <leo.giordani(at)libero.it>
it --> en: Leonardo Giordani <leo.giordani(at)libero.it>
en --> ru: Kolobynin Alexey <alexey_ak0(at)mail.ru>

2002-12-05, generated by lfparser version 2.31