获得进程ID: #include<sys/types.h> #include<unistd.h> pid_t getpid(void) //pid_t是一个int型 Linux是复制进程而不是创建进程,有两个函数fork()和clone(),区别是前者是全部复制,后者是选择复制。fork()和vfork()的区别是前者是全部复制,后者是只复制task_struct和系统堆栈。即前者是独立的内存,后者是共享的内存。 fork(): #include<sys/types.h> #include<unistd.h> pit_t fork(void) 若创建成功,在父进程中返回子进程ID,在子进程中返回0。若出错则返回-1。 fork之后,子进程和父进程都从调用fork函数的下一条语句开始执行。如下代码: pid_t pid=fork(); if(pid==-1) //出错 { printf("Error in fork!"); exit(1);
} else if(pid==0) { //子进程中; } else //父进程中 大部分复制出来的进程一定会与父进程分道扬镳,执行自己的程序。那么就要使用exec函数族其中包括了execl、execlp、execle、execv、execvp、execve 6个函数。 进程的消亡: 有两个方式:一种是自然退出,exit()和_exit()。第二种是异常终止,abort()。 exit():立刻终止,清除所有数据结构。 #include<stdlib.h> void exit(int status) _exit(): #include<unistd.h> void _exit(int status) 区别:exit()会首先执行一些文件关闭操作 进程调用了exit和_exit之后并非立刻消失,而是留下一个僵尸进程的数据结构,可以用wait和waitpid来处理。 #include<sys/types.h> #include<sys/wait.h> pid_t wait(int* status) status用来收集进程退出的状态(若不需要则置为NULL),若成功则返回等待进程的ID,若失败则返回-1。 进程一旦调用了wait,会立即阻塞自己。由wait自动分析是否当前进程的某个子进程已经退出,如果让他找到这样的一个已经变成僵尸进程的子进程,wait就会手机这个子进程的信息,并把它彻底销毁后返回,如果没有找到这样的一个子进程,则wait会一直阻塞在这里,知道出现一个为止。 如下代码: pid_t pid=fork(); if(pid==-1) //出错 { printf("Error in fork!"); exit(1); } else if(pid==0) { //子进程中; } else { pid_t pWait=wait(NULL); //等待子进程 }waitpid: #include<sys/types.h> #include<sys/wait.h> pid_t waitpid(pid_t pid,int* status,int options)pid取值 含义 pid>0 只等待进程ID为pid的子进程,不管其他已经有多少子进程运行 结束退出,只 要指定的子进程还没有结束,则waitpid就一直等待下去。 pid=-1 等待任何一个子进程退出,没有任何限制,此时等价于wait pid=0 等待同一个进程组中的任何子进程,如果某一个子进程已经加入了别的进程 组,则waitpid不会对它有任何理睬 pid<-1 等待一个定制进程组中的任何子进程,这个进程组的ID等于pid的绝对值 options目前只支持WNOHANG和WUNTRACED两个选项 如下代码: pid_t pid=fork(); if(pid==-1) //出错 { printf("Error in fork!"); exit(1); } else if(pid==0) { //子进程中; } else { pid_t pWait=waitpid(pid,NULL,WNOHANG); //参数WNOHANG表示不会等待子进程,若没有已退出的子进程则直接返回0 }abort():会产生一个core dumped文件 #include<stdlib.h> void abort(void) system(): #include<stdlib.h> int system(const char* cmdstring) 执行system时会调用fork、exec、waitpid,因此有三种可能的返回值。 -1 fork失败或者waitpid返回出来EINTR之外的错误 127 exec失败若都成功则返回shell的终止状态 若cmdstring为NULL则表示仅当命令处理程序可用时返回非0。可用于测试给定的操作系统上是否支持system函数。 |
|
来自: sky_feiyang > 《Linux》