进程
1.进程就是运行中的程序,一个程序可能存在多个进程,每个进程都在执行特定的任务。
2.进程一般可分为交互进程,批处理进程和守护进程三类。
3.在Linux中可以通过ps指令查看进程信息。
4.孤儿进程:父进程先于子进程结束,则子进程则会成为孤儿进程,同时被init进程收养。
5.僵尸进程:子进程咸鱼父进程结束,但父进程没有回收子进程的相关资源。
常用函数接口
#include <unistd.h>
1.getpid();
2.getppid();
3.getuid();
4.geteuid();
5.getgid();
6.getegid();
7.fork();
8.vfork();
8.exit(int status);
9.pid_t wait(int *status);
10.pid_t waitpid (pid_t pid, int* status, int options);
例子
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void checkStatus(int status){
if(WIFEXITED(status)){
printf("进程正常结束,返回值为:%d\n",WEXITSTATUS(status));
}else if(WIFSIGNALED(status)){
printf("进程异常终止,终止信号为:%d\n",WTERMSIG(status));
}
}
int main()
{
pid__t ids[5];
int i;
for(i=0;i<5;i++)
{
ids[i] = fork();
if(ids[i] = -1)
{
perror("fork!!!");
return -1;
}
if(ids[i] == 0) break;
}
if(i<5){
printf("******我是子进程:%d, 是第%d个进程!\n",getpid(),i+1);
sleep(i*10);
printf("******我是子进程:%d, 我死了!\n",getpid());
return i+1;
}
int status = 0;
for(i=0;;i++){
pid_t inid = 0;
printf("[-1:任意一个子进程 0:同一个进程组的任意子进程 >0:指定子进程]:");
scanf("%d",&inid);
pid_t id = waitpid(inid,&status,WNOHANG);
if(id == -1){
--i;
if(errno == ECHILD){
printf("所有的子进程都已退出!\n");
break;
}
continue;
}else if(id == 0){
printf("等待的子进程没有结束!\n");
}
checkStatus(status);
}
return 0;
}