linux 进程

2024-01-07 21:29:49

进程

1.进程就是运行中的程序,一个程序可能存在多个进程,每个进程都在执行特定的任务。
2.进程一般可分为交互进程,批处理进程和守护进程三类。
3.在Linux中可以通过ps指令查看进程信息。
4.孤儿进程:父进程先于子进程结束,则子进程则会成为孤儿进程,同时被init进程收养。
5.僵尸进程:子进程咸鱼父进程结束,但父进程没有回收子进程的相关资源。

常用函数接口

#include <unistd.h>

1.getpid(); //获取进程id
2.getppid();//获取父进程id
3.getuid();//获取实际用户id
4.geteuid();//获取有效用户id
5.getgid();//获取实际组id
6.getegid();//获取有效组id
7.fork();//创建一个子进程,失败返回-1,分别在父子进程返回pid,子进程有父进程的数据段和堆栈,切共享父进程的代码段,并且共享文件表。
8.vfork();//创建一个子进程,与fork()区别为vfork()并不复制父进程的地址空间,并且子进程会优先调度。
8.exit(int status);//进程退出
9.pid_t wait(int *status);//等待子进程结束
10.pid_t waitpid (pid_t pid, int* status, int options);//一般用于等待特定子进程
	//pid :-1(任意一个子进程),0(同一个进程组的任意子进程,>0(特定子进程))
	//status;通过输出参数status返回给调用者,不关心可值为NULL
	//options:一般取0,如果有需求,可以如下
	/*
	?WNOHANG 
		非阻塞模式,若没有可用的子进程状态,则返回0。 ?WUNTRACED 
		若支持作业控制,且子进程处于暂停态,则返回其状态。
	?WCONTINUED 
		若支持作业控制,且子进程暂停后继续,则返回其状态。

	*/
/*
?WIFEXITED() 
	子进程是否正常终止,是则通过WEXITSTATUS()宏,获取子进程调用exit/_exit/_Exit函数,所传递参数的低8位。 
 	因此传给exit/_exit/_Exit函数的参数最好不要超过255。
?WIFSIGNALED() 
	子进程是否异常终止,是则通过WTERMSIG()宏获取终止子进程的信号。
?WIFSTOPPED() 
	子进程是否处于暂停,是则通过WSTOPSIG()宏获取暂停子进程的信号。
?WIFCONTINUED() 
	子进程是否在暂停之后继续运行 

*/

例子

#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){//由于子进程提前退出循环,在这里先将子进程关闭,父进程执行时i=6,则不进入执行
		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;
}

文章来源:https://blog.csdn.net/qq_52575999/article/details/135443619
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。