1. ------------------------------------------------------------------------------------- | 3 |
2. ------------------------------------------------------------------------------------------ | 4 |
3. ---------------------------------------------------------------------------------------- | 5 |
4. --------------------------------------------------------------------------------------- | 6 |
5. -------------------------------------------------------------------------------- | 7 |
6. --------------------------------------------------------------------- | 10 |
7. -------------------------------------------------------------------------- | 14 |
8. ----------------------------------------------------------------------- | 15 |
9. ----------------------------------------------------------------------- | 16 |
10. ---------------------------------------------------------------------------------------- | 18 |
11. ------------------------------------------------------------------------ | 18 |
UNIX . , . , , . , , . , .
, process ID, PID, , , . , , . . , , . . , init. init , PID 1. init .
.
fork(), . . exec(). , UNIX .
|
|
UNIX fork().
fork(), .
, , , .
exec() .
.
1. , . .
2. 1 , .
3. , .
4. . .
5. , 2 , () .
1.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t pid, ppid;
int a = 0;
(void)fork(); //
a = a+1; //
pid = getpid(); // pid
ppid = getppid(); // pid
printf("My pid = %d, my ppid = %d, result = %d\n", (int)pid, (int)ppid, a); // , a
return 0;
}
2.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t pid, ppid;
pid = fork(); //
if(pid == -1){ //
printf("\nError!!!");
} else if(pid == 0){ //
printf("I'm child!\n");
} else { //
printf("I'm you father!\n");
}
return 0;
}
3.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[], char *envp[]){
printf(" : \n");
int i = 0;
for(; i < argc; i++){ //
printf("%s ",argv[i]); //
}
printf("\n : \n");
i = 0;
while(envp[i]!= NULL){ // NULL
printf("%s\n",envp[i]); //
i++;
}
return 0;
}
4.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[], char *envp[]){
(void)execle("/bin/cat","/bin/cat","03-2.c",NULL,envp); // cat " " " "
|
|
printf("Error!"); // ,
exit(-1);
return 0;
}
5.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[], char *envp[]){
pid_t pid;
pid = fork(); //
if(pid == -1){ //
printf("\nError!!!");
} else if(pid == 0){ //
execle("/bin/ls","-l",NULL,envp); // ls -l
} else { //
wait(); //
printf("I'm you father!\n");
}
return 0;
}
-
1.
2.
3.
4.
5.
1.
2.
3.
4.
5.
1.
fork() . a , . . , , .
2.
fork(), . , -1, , , 0, , , , . .
3.
, , main- *argv, argc, main(). . *envp, main(). NULL, while().
4.
execle() . NULL. . .
5.
, fork() () (ls -l). .
UNIX . , . , , . , , . , .
, process ID, PID, , , . , , . . , , . . , init. init , PID 1. init .
|
|
UNIX fork() exec().
fork() , () , . fork() ( fork() PID , ).
fork() exec(), ( , , UNIX ). , () UNIX ( ) , init ( PID = 1), .
( ) exit(), wait() ( waitpid()) . , wait() , (zombie), . .
.
- . main() . , . , , . , : argc argv. argc , 1, . argv . - . , .
fork(), , ( ). getpid() getppid(). exec(), , exec(). fork().
1. . Linux. ..: , 2008. 416 .