1.Get the process ID
#include <sys/types.h> #include <unistd.h> vpid_t getpid(void) 获取本进程ID。 vpid_t getppid(void) 获取父进程ID。 2.Create process A:fork #include<unistd.h> pid_t fork(void) 功能:创建子进程 fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值: 1. 在父进程中,fork返回新创建的子进程的PID; 2. 在子进程中,fork返回0; 3. 如果出现错误,fork返回一个负值 Eg:fork1.c(演示) #include <sys/types.h> #include <unistd.h> main() { pid_t pid; /*此时仅有一个进程*/ pid=fork(); /*此时已经有两个进程在同时运行*/ if(pid<0) printf("error in fork!"); else if(pid==0) printf("I am the child process, ID is %d\n",getpid()); else printf("I am the parent process,ID is %d\n",getpid()); } 在pid=fork()之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,这两个进程的共享代码段,将要执行的下一条语句都是if(pid==0)。两个进程中,原来就存在的那个进程被称作“父进程”,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同。 Eg: #include <unistd.h> #include <stdio.h> int main(void) { pid_t pid; int count=0; pid = fork(); count++; printf( “count = %d\n", count ); return 0; } 子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。在子进程中对count进行加1的操作,并没有 影响到父进程中的count值,父进程中的count值仍然为0。 B:vfork #include <sys/types.h> #include <unistd.h> pid_t vfork(void) 功能:创建子进程。
3.different between fork and vfork 区别: 1. fork:子进程拷贝父进程的数据段vfork:子进程与父进程共享数据段 2. fork:父、子进程的执行次序不确定vfork:子进程先运行,父进程后运行
EG: #include <unistd.h> #include <stdio.h> int main(void) { pid_t pid; int count=0; pid = vfork(); count++; printf( “count = %d\n", count ); return 0; }
4.exec函数族
exec用被执行的程序替换调用它的程序。 区别: fork创建一个新的进程,产生一个新的PID。exec启动一个新程序,替换原有的进程,因此进程的PID不会改变。 A:execl #include<unistd.h> int execl(const char * path,const char * arg1, ....) 参数: path:被执行程序名(含完整路径)。 arg1 –argn: 被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。
Eg: #include<unistd.h> main() { execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0); } B:execlp #include<unistd.h> int execlp(const char * path,constchar * arg1, …) 参数: path:被执行程序名(不含路径,将从 path环境变量中查找该程序)。 arg1 –argn: 被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。 Eg: #include<unistd.h> main() { execlp(”ls”,”ls”,”-al”,”/etc/passwd”,(char *)0); } C:execv #include<unistd.h> int execv (const char * path, char * const argv[ ]) 参数: path:被执行程序名(含完整路径)。 argv[]: 被执行程序所需的命令行参数数组。 Eg: #include <unistd.h> main() { char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*)0}; execv(“/bin/ls”,argv); } D:system #include <stdlib.h> int system( const char* string ) 功能: 调用fork产生子进程,由子进程来调用/bin/sh -c string来执行参数string所代表的命令。
Eg: #include <stdlib.h> void main() { system(“ls -al /etc/passwd”); }
exec函数族会在个进程中启动另一个程序执行。并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完exec函数调用后,原调用进程的内容除了进程号之外,其他全部被新的进程替换了
Personal summary
5.Process Waiting 进程等待 #include <sys/types.h> #include <sys/wait.h> pid_t wait (int * status) 功能: 阻塞该进程,直到其某个子进程退出。 Eg: #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> void main() { pid_t pc,pr; pc=fork(); if (pc==0){ /* 如果是子进程*/ printf(“This is child process with pid of %d\n”,getpid()); sleep(10); /* 睡眠10秒钟*/ } else if (pc>0){ /* 如果是父进程*/ pr=wait(NULL); /* 等待*/ printf("I catched a child process with pid of %d\n"),pr); } exit(0); } 用 fork创 建子进程后,父 子进程的执行顺序 fork涵数不能确定。我们可以用w酣 两数和W砷uⅡ函数使父进程阻塞等待子进程退出的性质, 来 确保子进程先结束。 |
进程控制编程
最新推荐文章于 2023-03-26 23:51:55 发布