linux进程

原创 2013年12月04日 23:00:19

unistd.h 是 C 和 C++ 程序设计语言中提供对 POSIX 操作系统 API 的访问功能的头文件对于类 Unix 系统,unistd.h 中所定义的接口通常都是大量针对系统调用的封装(英语:wrapper functions),如 fork、pipe 以及各种 I/O 原语(read、write、close 等等)。
sys/types.h中文名称为基本系统数据类型在应用程序源文件中包含 <sys/types.h> 以访问 _LP64 和 _ILP32 的定义。此头文件还包含适当时应使用的多个基本派生类型。尤其是以下类型更为重要:
caddr_t 核心地址。
clock_t 表示系统时间(以时钟周期为单位)。
comp_t 压缩的时钟滴答。
dev_t 用于设备号。
fd_set 文件描述集。
fpos_t 文件位置。
gid_t 数组值ID。
ino_t i节点编号。
off_t 用于文件大小和偏移量
mode_t 文件类型,文件创建模式。
 pid_t进程ID和进程组ID
ptrdiff_t 是一种带符号整型,用于对两个指针执行减法运算后所得的结果。
rlim_t 资源限制;
size_t 反映内存中对象的大小(以字节为单位)。
ssize_t 供返回字节计数或错误提示的函数使用。
time_t 以秒为单位计时。
uid_t 数值用户ID。
wchar_t 能表示所有不同的字符码。
所有这些类型在 ILP32 编译环境中保持为 32 位值,并会在 LP64 编译环境中增长为 64 位值。
一、启动一个新进程

Fork创建新的进程。新进程几乎与原进程一模一样的,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。



代码如下:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
	pid_t pid;
	char * message;
	int n;
	
	printf("fork program starting\n");
	pid = fork();
	switch(pid)
	{
	case -1:
	    perror("fork failed");
	    exit(1);
	case 0:
	    message = "This is the child";
	    n = 5;
	    break;
	default:
	    message = "This is the parent";
	    n = 3;
	    break;
	}
	
	for(; n > 0; n--) {
		puts(message);
		sleep(1);
	}
	exit(0);




}

执行结果如下:



 二、等待一个进程

 wait系统调用将暂停父进程直到它的子进程结束为止。这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。

sys/wait.h 文件中包含了一些宏,WIFEXITED(stat_val) 表示 如果子进程正常结束,它就取一个非零值。WEXITSTATUS(stat_val)表示如果WIFEXITED非零,它返回子进程的退出码。


代码如下:

#include <sys/types.h>
#include <sys/wait.h>

#include <unistd.h>
#include <stdio.h>

int main()
{
	pid_t pid;
	char * message;
	int n;
		
	int exit_code;
	
	printf("fork program starting \n");
	pid = fork();
	switch(pid)
	{
		case -1:
		    perror("fork failed");
		    exit(1);
		case 0:
		    message = "This is the child";
 		    n = 5;
		    break;
		default:
		    message = "This is the parent";
		    n = 3;
		    break;
	}
	for(; n > 0; n--) {
		puts(message);
		sleep(1);
	}
	// 此部分等待子进程完成
	if(pid != 0) {
		int stat_val;
		pid_t child_pid;
		
		child_pid = wait(&stat_val);
		printf("Child has finished: PID = %d\n", child_pid);
		if(WIFEXITED(stat_val))
			printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
		else
			printf("Child terminated abnormally\n");
	}
	printf("before exit\n");
	exit(exit_code);
}

执行结果如下:



第一个"before exit"由子进程打印,第二个“before exit”由父进程打印。

 

 

三、僵尸进程

个进程在调用exit命令结束自己的生命的时候,其实

linux中的僵尸进程

linux中的僵尸进程

它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。

在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,

子进程终止时,它与父进程之间的关联还会保持,直到父进程也正常终止或父进程调用wait才告结束。因此,进程表中代表子进程的表象不会立刻释放。虽然子进程已经不再运行,但它仍然存在与系统中,因为它的退出码还需要保存起来以备父进程今后的wait调用使用。这是它将成为一个僵尸进程。

 

 

 

 


linux下进程无缘无故消失

最近发现每隔一段时间,某一台机器线上的服务总是挂掉,进程直接就消失了,别的机器上的服务都正常跑着,怎么单单某一台的服务的进程就没有了呢,奇怪啊,也没有什么征兆,最后发现:执行 last reboot ...
  • iamlihongwei
  • iamlihongwei
  • 2016年11月23日 18:10
  • 1964

linux 0号进程 1号进程 区别(转)

系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型。整个linux系统的所有进程也是一个树形结构。树根是系统自动构造的,即在内核态下执行的0号进程,它是所有进...
  • shenwansan_gz
  • shenwansan_gz
  • 2015年02月04日 20:18
  • 1188

Linux进程理解与实践(五)细谈守护进程

一. 守护进程及其特性      守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端...
  • NK_test
  • NK_test
  • 2015年09月14日 19:26
  • 2082

浅谈Linux进程等待

首先我们要想到两个问题:1、进程为什么等待?2、进程怎么等待?为什么等待:首先要知道进程终止或者退出的时候会发生什么,进程会关闭所有文件描述符,释放在用户空间分配的内存,但是PCB却会暂时保留,里面存...
  • juxin960811
  • juxin960811
  • 2017年06月11日 20:14
  • 186

linux根据进程名字获取进程ID

一、前言:要在程序中启动某一程序,如果程序已经存在了,就不再启动。查找了N篇文档,有所收获,总结一下。 二、实现 大体分两种: 1、exec或popen执行ps的命令行,然后运用某几个字符串匹配...
  • guduandejiaoyin6919
  • guduandejiaoyin6919
  • 2014年11月07日 16:59
  • 1518

Linux获取进程列表

实现思路是:遍历/proc目录下的所有进程描述文件夹,从而获取进程列表。 代码如下:...
  • cnclenovo
  • cnclenovo
  • 2014年08月14日 11:23
  • 1264

Linux 进程间 互斥锁

进程间共享数据的保护,需要进程互斥锁。与线程锁不同,进程锁并没有直接的C库支持,但是在Linux平台,要实现进程之间互斥锁,方法有很多,大家不妨回忆一下你所了解的。下面就是标准C库提供的一系列方案。 ...
  • u011244446
  • u011244446
  • 2015年08月06日 11:27
  • 5253

小何讲进程: Linux进程的基本概念

进程是一个独立的可调度的活动; 进程是一个抽象实体,当它执行某个任务时,要分配和释放各种资源; 进程是可以并行执行的计算单位; 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动;...
  • rl529014
  • rl529014
  • 2016年04月29日 11:15
  • 2640

Linux进程的睡眠和唤醒

在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux内核的调度器会剥夺这...
  • u013994536
  • u013994536
  • 2016年09月07日 11:37
  • 2539

Linux进程与线程的区别

进程与线程的区别,早已经成为了经典问题。自线程概念诞生起,关于这个问题的讨论就没有停止过。无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了。一般程序员而言,搞清楚二者的概念,...
  • laviolette
  • laviolette
  • 2016年05月26日 14:19
  • 11125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux进程
举报原因:
原因补充:

(最多只允许输入30个字)