|
|
��� �������� �������� �� ��������� ������: English Castellano ChineseGB Deutsch Francais Italiano Nederlands Russian Turkce Polish |
����� Leonardo Giordani <leo.giordani(at)libero.it> �� ������: ������� ���������� ���������������� ���������� ���������������� ���������,
�������� ������� ���������������, ������������ ����������������� (� �������� �� ���������� � C/C++).
C 1999 ���� �������� ������������� � Linux/Unix.
|
������:
���� ������� ����� ������ ����������� �������� � �������� ��������������� � � �� ����������� � ������������ ������� Linux. ������� � ������������� ���� ����� ���������������, �� �������� ���������� ����������, ������� ���������������� �������������� ����� ���������� �� ��������, �� ������������ ���������. ��� ��������� ������ ��� �����:
��� ���������� ����������� ���������� �������� ���������� ���������� ������� ���������� ������������ �������. ����� �������� ���������� ����� ������������ �����������, ���������� ������� � ������ ������ � ����������� � ��� ���������� ������ ��� �� ����������.
����� ��� ��� �����������, ��� ���������� ������ ������ Linux, ����������� � ����������� �������������: ����� ���� ������������� ���������, � ������ ������ ������� ��� ��� ����� ����������, �� ������� ��� �������, ������� ������ ��� ����� �������� ������, ������� �� �������, ��������� ���������� �������� ���������� ���������������, ����� ��� ����� ��� ������� ������ (����� ��������� ���������� ��� ����������).
��������� ������� ������������� ��������� ��� ������������ ����, ������� ������ � ��������� ����������. ���� � �����-�� ����� ������ ������ ��������� ��� ���������� � �������� �� �� ��� �� ����� ������ ������������� ���������, �� ���������� ��������� ����� ���������� � �����, ��� ��� ���� ����������� �����: ���������� ��� ��������� ���������� ��� ������ � ������ ���������, �� ������� ����� ��������� ����������� ���������� ��������. ������ ������� (��� ������) ������������ ��� ����������� ������������� ���������.
����������, ��� ���������� � �������, � ������� �� �������� �� ��������: � ������ ������ ������� ����������� ������ ���� ������ (���� ������ ���� ��������������, � �� �� ����� ������ ��� ���� ������������), � ������ ��������� ����� �� ����; ����� ������������� ���������� �������, ����������� �������, ������������� ������� ���������������, ��� ���������� ����������� � ���������� �� �� �� ���������� ������� ��������, ��� ��� ����� ����������� � ��������� ����� ������� � �.�. ��� ��, ��� �� �������� ����������������.
��� ���� �������� �� ��������, ��������������� ��������� ����� �������, ������� ������ �� ��� ������������, �������� ���������� �������� ������������� ��������� (����������). ��� �� �����, ��� ������ ���� ������ � ����������� ������ ������������ �������. ��������, ���� ��������� ����� ��������� ���� �� ����������� ������, ����� ���� � �������������� ��������� ������ ���� ���� Linux.
������� ������ ���-��� � ���������, ������������� �� ����� ������. �������, ������� ���� ��� ������ ����������, ���������� 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 � ������� � ����� �� ��������� ������.
������, ����� �� ����� ������������� � �������� � ��� ������ ���� � ����� ������������ �������, ������ ������ ������������� ���. �� �������� �������������� ���������� ��������� �� �������� � ����� ��������: ��� ������������ ����� ����� ������������� ���������� � �� �������������. �� ������ ��� ���������� ������� ���� �������: ��������� � ��������, ������ ��������� ����� ������ ����������� � ������� ������, ����������� �������. ����� ���������, � ��� ����� �����, ����� ������ ������ ���� ���������, ���������� �� ���� �����.
����������� ���������� 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 ���� � �������������, � ��������� ��������� ���� � ��������� ���������, ���� ��� � ����� ����������� �����. ������ ����������!
�� ������� �����
|
Webpages maintained by the LinuxFocus Editor team
© Leonardo Giordani, FDL LinuxFocus.org |
Translation information:
|
2002-12-05, generated by lfparser version 2.31