|
|
| This document is available in: English Castellano ChineseGB Deutsch Francais Italiano Nederlands Russian Turkce Polish |
by Leonardo Giordani <leo.giordani(at)libero.it> ��������: ��������������ѧԺ���ߵ繤��ϵѧ������������Ա�������ڱ��̣���Ҫʹ�û�����C/C++���ԣ���1999���Ժ�������ֻ��Linux/Unix�¹�����
|
ժҪ:
��ϵ�����������������߽��ܶ���������(multitasking)�������Linuxϵͳ�е�ʵʩ�����Ȳ������������������ۻ���������һ��ʹ�ü�Ч��ͨѶЭ������ʾ���̼�ͨѶ���������������豳��֪ʶ��
����ִ�г�����������ϵͳ���������ĸ��ӻ���Ϊ�˷�ֹ��������ʱ������ͻ����ȻҪ��������������ʱ������������Ϣ��װ������
��̽��Linuxϵͳ�ڲ�ϸ��ǰ�������ȶ���һЩ�������һ�����е�������PROGRAM��, ��ijһʱ�̣����루CODE�������ɳ�����ָ��ڴ��ռ䣨MEMORY SPACE���DZ���������ռ�õIJ����ڴ棬������״̬��PROCESSOR STATUS�����������IJ������������ǣ�flag���ͳ�����������Program Counter����һ��Ҫ��ִ�е�ָ���ĵ�ַ����
���Ƕ�������̬������RUNNING PROGRAM��Ϊ���룬�ڴ��ռ䣬������״̬�ȶ����ļ��ϡ��ڼ��������е�ijһʱ�̣����DZ���һ������̬���������ݣ�������һ����̬���������ݲ�ִ�У�֮�����ô˳�������ǰ�жϴ�����ִ�У�����ʵ����ǰ�����Ľ���ִ�С����̣�PROCESS����������TASK������������������̬������
���ǽ���һ�¼������ᵽ�Ĺ���վ�����л��ƣ�����һʱ�̶�ֻ��һ��������ִ�У�������������ͬʱ�������£���������ִ�����Ĵ��룬�ڳ���һʱ���Σ�QUANTUM��������������֮���������ݲ�������һ�Ⱥ����̵����ݣ�ִ��һʱ���κ��л�����������ν�Ķ�����������
���������Ķ�����������������������Ҫ���������д��Dz��ܱ����ӵģ������ȴ����̶��еĹ�����SCHEDULING����Ȼ�����Dz���ϵͳ����ʱҪ���ǵ����⣬���ǻ����Ժ������������ۣ�Ҳ��Ҳ������һЩLinux�ں˴��롣
�ܹ���ʾ�����������н�����Ϣ��������ps(1)�����ǡ�����״̬��process status��������д������shell���ڲ�����ps�����Եõ�����������
PID TTY TIME CMD 2241 ttyp4 00:00:00 bash 2346 ttyp4 00:00:00 ps
�����������������������������������ǿ���˵�����⣺ps�и��������дӵ�ǰ�ն����еĽ��̡�����һ�и��������д˽��̵����������mozilla����Mozilla Web����������gcc����GNU������������ȻpsӦ�ó����������У�������Ϊps�г��������еĽ���ʱ�䱾��Ҳ�������С���������һ������Bourne Again Shell���������ڴ��ն��ϵ�shell��
�����ݲ�����TIME�к�TTY�У�������PID��Process IDentifier�����̱�־�����С�pid�Ƿ�����ÿһ���̵������������㣬���ظ������ڽ��̽����������ظ�ʹ�ã��ڽ��������ڼ䱣�ֲ��䡣���������ļ�����������ps�õ��Ľ��������������ӿ��ܲ���һ�������Ǵ�������һ��shell���ڲ�����ps��ͬʱ�����ر�ǰһshell���ڡ����ǵõ�ͬ������������ǽ��̱�־����һ����֤���˼�ʹ����ͬ�ij�����Ҳ�����Dz�ͬ�Ľ��̡�
���ǿ����г�Linuxϵͳ�����е����н��̣�Linux�ֲ�ҳ���ᵽps��-eѡ����ν�š�ѡ�����н��̡��� ��shell�������롰ps -e�������Եõ�������������ͬ��ʽ�ij����Ľ����б���Ϊ�˷����������������ǽ�ps�������ض�����ps.log�ļ��У�
ps -e > ps.log
�������ǿ���ʹ������ϲ���ı༭���Ķ��ͱ༭�����ļ������߽���ʹ��less����������¿�ʼ�������������еĽ�������������Ԥ�ڵĶࡣ�ڴ�ָ���������������������������Ľ��̣�ͨ�������л�ͼ�λ���������������������һЩ���̣�������Щ���ֺ����֡������Ľ��������ͽ�������������ϵͳ���þ���������������һЩ��ͬ�㡣���ȣ���������������ϵͳ��pidΪ1�Ľ��̱�Ȼ��init���̣����������������̵ĸ����̡�init������Զ�Dz���ϵͳ������ִ�еĽ��̣�����ӵ�е�pidΪ1����һ����Ҫָ�����ǣ�����������������������d��β�Ľ��̣����DZ���Ϊ�ػ����̣�daemon������ϵͳ������Ҫ��һЩ���̡��й�init���̺��ػ����̵�ϸ�ڽ����Ժ������������ۡ�
�������ڲ����˽��̵ĸ���������ϵͳ�е���Ҫ�ԣ����潫����һЩ���������������Ĵ��룺�ӼĽ���ͬʱִ�е����н��̼�ͨ�ź�ͬ����synchronization�������ǽ����۽��̼�ͨ�ź�ͬ�������������Ľ�����������Ϣ��message�����ź�����semaphore������������Ϣ���������ڴ˻����Ͽ��������Լ���Ӧ�ó������ź��������Ժ��������к��̣߳�thread��һ���������ۡ�
C���Ա��⺯����libc����Linux����glibcʵʩ��ʹ��Unix System V�Ķ������������ơ�Unix System V�����ڳ�ΪSysV����һ����ҵ����Unixʵʩ�汾������������Ҫ��Unix����֮һ�Ļ�������һ��Unix�����Ļ�����BSD Unix��
��libc����������pid_t������Ϊ�ܹ�����pid�������������ڿ�ʼ������pid_t���ͱ�ʾpid��ֵ��������������һЩ����Ȼ�����Ϳ���ͬ������pid��ֵ��
���º������ص��ô˺����Ľ��̵�pid��
pid_t getpid (void)
��pid_t��unistd.h��sys/types.h�ж��壩���DZ�дһ�������������������Լ���pid������ϲ���õı༭���м������´��룺
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
int main()
{
pid_t pid;
pid = getpid();
printf("The pid assigned to the process is %d\n", pid);
return 0;
}
��������Ϊprint_pid.c�����룺
gcc -Wall -o print_pid print_pid.c����������һ����Ϊprint_pid�Ŀ�ִ�г�����������ǰĿ¼û�а�����path���������У���Ҫ�á�./print_pid��������ִ�д˳�����ִ�н��������������Ǹе����⣺����һ��������������ִ�ж��Σ�������������������������ֵ�����̶�����Ϊ������������������print_pidִ�м����С����磬����������print_pidִ�м�����ps��
�����������δ������̣���������һ�´����Ĺ��̡���һ��������A����������һ������Bʱ��������������ͬ�ġ���������ͬ�Ĵ��룬�ڴ��ռ���������ͬ����ͬ���ڴ��ռ䣩��������״̬��ͬ����֮�������в�ͬ��ִ�����̡����������û�������ijЩ�������ݵIJ�ͬ����ͬ������A�Ǹ����̶�����B���ӽ��̣��������ǿ��Ը��õ��˽�Ϊʲôinit�����������������̵ĸ����̡������½��̵ĺ���Ϊ��
pid_t fork(void)����������Դ����ʹ���̵�ִ��·���ֲ������ԣ�����ֵ��pid��ֵ��ע�����ǣ���ǰ���̸����Լ����ɸ����̺��ӽ��̣�����������һ��ִ�У����ɲ�ͬ�Ĺ����������Ƹո�����ʱ��һ�����̻ᱻִ�У������̻����ӽ��̣��𰸺ܼ�����֮һ��������ע��Ҳ���ܶ��߶���ִ�У�����ϵͳ���ȳ�������ִ���ĸ����̣����������ĵȴ�ִ�еĽ����Ǹ����̻����ӽ��̣������㷨����������������
֪���ĸ�������ִ������Ҫ�ģ���Ϊ���ǵĴ�����ͬ���������̶����������̺��ӽ��̵Ĵ��룬����ÿ�����̶�ִֻ�����е�һ���֡�Ϊ�˳����˸�����ǿ��������㷨��
- FORK - IF YOU ARE THE SON EXECUTE (...) - IF YOU ARE THE FATHER EXECUTE (...)�����㷨��α���������������ʵ��fork�������ӽ����з���0���ڸ������з����ӽ��̵�pid�����Ը���fork�������ص�pid�Ƿ�Ϊ0������Ч���ж�������Ҫִ���IJ��ִ��롣�����㷨����C���Գ����У�
int main()
{
pid_t pid;
pid = fork();
if (pid == 0)
{
CODE OF THE SON PROCESS
}
CODE OF THE FATHER PROCESS
}
�������DZ�д��һ�������Ķ������������������´������Դ�Ϊ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("-SON-\n");
(11) }
(12) return(0);
(13) }
(14) for (i = 0; i < 8; i++){
(15) printf("+FATHER+\n");
(16) }
(17) return(0);
(18) }
(01)-(03)������Ҫ��ͷ�ļ�����I/O����������������
main������GNU�����������ڳ�������������û�д����������·���0�����������ش���(05)����pid���ͣ�(06)����ѭ�����Ʊ�����������������ʵ����ͬ�ģ����ڴ�Ϊ���ó��������������ֿ�����
(07)����fork���������ӽ����з���0���ڸ������з����ӽ���pid������ֵ��(08)�в��ԡ��ӽ���ִ��(09)-(13)��������ִ��(14)-(16)��
�����ִ��������Ǹ����̻����ӽ��̷ֱ�����8���ַ�����-SON-���͡�+FATHER+����Ȼ��0����������0�������ӽ��̺���Ҫ����Ϊ�ӽ���ѭ�����������������أ�������ִ�и����̵Ĵ��루��������һ�£��Լ���������ֻ������ȷ���������������Ĺ��ܣ�����Ϊ���������������������Ǹ��ӳ��Ķ������н�����һ����ͬ�������������������ױ����֣��������ݽ������Գ���ͨ����̫���ܡ�
�����ܶ�ִ�н����������⣺�������̲���һ���ϸ��ؽ�������������������Ϊ����ѭ����ִ���ٶȿ��ܲ�ͬ��������������������һ�顰+FATHER+���ַ�������һ����-SON-"�ַ������������෴������ִ�ж��γ������ᷢ�������������仯��
��printf����ǰ����һ���������ӳٻ�ʹ�����������������ж���������Ч����������sleep��rand������ʵ�֡�
sleep(rand()%4)����ʹ���̹���0��3֮����һ������������%�������������������������ڴ�����Ϊ��
(09) for (i = 0; i < 8; i++){
(->) sleep (rand()%4);
(10) printf("-FIGLIO-\n");
(11) }
��������Ҳ��ͬ�����ģ���Ϊfork_demo2.c��Ȼ������ִ�С�������ִ���ٶȱ����������ǿ��Թ۲쵽����˳���ĸı䡣
[leo@mobile ipc2]$ ./fork_demo2 -SON- +FATHER+ +FATHER+ -SON- -SON- +FATHER+ +FATHER+ -SON- -FIGLIO- +FATHER+ +FATHER+ -SON- -SON- -SON- +FATHER+ +FATHER+ [leo@mobile ipc2]$
������������һ���µ����⣺��һ�����д��������и����̿��Դ���һ���������ӽ��̣��ӽ���ִ�еIJ���������ִ�еIJ�����ͬ�������̾�����Ҫ���ӽ���ͨ�Ż�����Ҫ���ӽ���ͬ����synchronize��������ȷ��ʱ��ִ���ض����������̼�ͬ���ĵ�һ�ֽ��������ǵ���wait������������ע��synchronizationͨ��ָ���̻��̼߳���ֹͬʱ��д��ͬ������ϵͳ��Դ�Ļ��ƣ��ڴ�����ָ��������֪���ӽ��̽�����ʱ�䣩
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("-SON-\n");
}
return 0;
}
sleep (rand()%4);
printf("+FATHER+ Waiting for son's termination...\n");
waitpid (pid, NULL, 0);
printf("+FATHER+ ...ended\n");
return 0;
}
�������Ѽ���sleep�����ĵ��ã���ʹ�����������С����˳�����Ϊfork_demo3.c������ִ�С��������Ǿ������˵�һ��ͬ���Ķ���������������
��ƪ���������ǽ����۸����Ľ��̼�ͨ�ź�ͬ�����⡣���ǿ������������ܵĺ�����д�������ң������ҿ��������е�һЩ��Ϊ���������ʹ���ʵ�����뷢�ʹ�ע�͵�C�ļ��Ͱ�������˵�����������֣�email��ַ��˵���ļ����ҡ�
|
|
��ҳ��LinuxFocus�༭��ά��
© Leonardo Giordani, FDL LinuxFocus.org ����������LinuxFocus������������������ |
������Ϣ:
|
2003-04-06, generated by lfparser version 2.25