一) 创建进程<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1. fork系统调用
fork调用创建一个新进程。新的进程或者说子进程是调用进程或者说父进程的副本。fork语法是:
#include <unistd.h>
pid_t fork(void);
如果fork执行成功,就向父进程返回子进程的PID,并向子进程返回0。这意味着你只调用fork一次,它也返回两次。
Fork创建的新进程是和父进程一样的副本,包括真实和有效UID和GID、进程组和会话ID、环境、资源限制、打开的文件以及共享内存段。
如下程序清单展示一个使用fork的简单示例程序。
/************************ child.c ***************************/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
pid_t child;
if((child=fork())==-1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if(child==0)
{
puts("in child");
printf("/tchild pid = %d/n",getpid());
printf("/t child ppid = %d/n",getppid());
exit(EXIT_SUCCESS);
}
else
{
puts("in parent");
printf("/t parent pid = %d/n",getpid());
printf("/t parent ppid = %d/n",getppid());
}
exit(EXIT_SUCCESS);
}
执行命令编译该程序。这个程序的输出应该和下面类似:
$./child
in parent
in child
child pid = 14091
child ppid = 14090
parent pid = 14090
parent ppid = 1549
二)控制进程
1. 等待进程--------wait函数族
一旦你用fork创建一个子进程,为了收集新进程的退出状态并防止出现僵进程,父进程应该等待子进程结束。
使用wait或waitpid函数可以收集子进程的退出状态。它们的原形如下:
#include <sys/wait.h>
#include <sys/types.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid,int *status,int options);
status保存子进程的退出状态。Pid是等待进程的PID。
Options规定wait调用的行为应该如何。它可以使WNOHANG,导致waitpid在没有子进程退出进程时立即返回,也可以是WUNTRACED,意味着它应该因为存在没有报告状态的进程而返回。你也可以对它们执行逻辑“或”(OR)操作,取得两种行为(也就是说,给options参数传送WHOHANG||WUNTRACED)。
1. 杀死进程
一个进程由于以下5个原因中的一个而终止。
。它的main函数调用了return
。它调用了exit
。它调用了_exit
。它调用了abort
。它被一个信号终止
前3个理由是正常终止,而后2和则是非法正常终止。但是无论进程为何终止,最后都执行相同的内核代码、关闭打开的文件、释放内存资源,并且执行其他要求的清理工作。
exit函数
这个函数在<stdlib.h>中声明的原型如下:
int exit(int status);
exit导致程序正常并且返回父进程的状态(status)。
_exit函数在<unistd.h>中声明。它立即终止调用它的进程。
使用abort函数
如果你需要异常地终止一个程序,可以使用abort函数。在Liux下,abort还可以让程序产生内存转储(core dump),这是大多数调式器用于分析程序崩溃时的文件。虽然任何打开的文件都被关闭了,但abort函数仍然是个粗暴的调用,应该作为最后的手段来使用,比如你碰到类似严重内存不足这样的错误,无法用程序的方法处理时再用。Abort也是一个标准库函数,它原型为
#include <stdlib.h>
void abort(void);
下面的程序显示了abort函数如何运行。
/*********************** abort.c ************************/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
abort();
/*shouldn’t get here*/
exit(EXIT_SUCCESS);
}
使用gcc编译这个程序,并如下执行:
$./abort
Aborted
Sulimit –c unlimited
$./abort
Aborted(core dumped)
注意你的系统可能不能生成一个core文件。如果它没有生成core文件,则按照上面的示范运行来使用shell的命令ulimit。
使用kill函数
一个进程能调用kill函数杀死另一个进程,它的原型如下:
#include <signal.h>
#include <sys/types.h>
int kill(pid_t pid,int sig);
pid指定了要杀死的进程,而sig是要发送的信号,如:SIGTERM,SIGKILL。
三)其它
1. 睡眠函数
#include <stdlib.h>
int sleep(int sec);
sec指示要睡眠的时间(秒)。
分享到:
相关推荐
### Linux进程管理详细解说 #### 一、程序与进程 **1.1 进程分类** 进程根据不同的应用场景可以分为以下几类: - **交互进程**:由用户直接与计算机进行交互的进程,例如终端中运行的命令。 - **批处理进程**:...
以下是基于标题“Linux 最全最好的解说”和描述“Linux 最全最好的解说,最具体的介绍,和最实用的工具”的详细解析。 ### Linux 内核与驱动程序开发 FreeElectrons是一家专注于Linux内核、驱动程序及嵌入式Linux...
它通过精细的权限管理,为系统中的每个进程、文件和其他资源分配安全上下文,实现严格的权限划分,有效防止恶意攻击和权限滥用。 **SELinux中文手册** 提供了对这一复杂系统的详细解释,帮助用户理解和配置SELinux...
"韩顺平2021图解Linux课程【重磅升级】资料分享"压缩包文件包含了丰富的学习材料,旨在通过清晰的图解和详细的解说,让学习者能够更加直观地理解和应用Linux系统。 首先,Linux操作系统是基于Unix的操作系统,以其...
下面将对这个主题进行详细的解说。 首先,我们从计算机的角度出发。计算机由硬件和软件两大部分组成。硬件包括中央处理器(CPU)、内存(RAM)、硬盘、显示器等。软件则包括操作系统、应用程序和其他各种系统软件。...
7. **进程管理**:了解ps、kill、nohup、top等命令,监控和控制系统的进程。 8. **网络配置**:设置网络接口,进行DNS解析,使用ping、traceroute等工具诊断网络问题。 9. **Shell脚本编程**:学习编写简单的Shell...
1. **Linux内核概述**:Linux内核是开源操作系统的基础,负责管理硬件资源、进程调度、内存管理以及设备驱动等核心功能。它是整个系统的心脏,确保所有软件组件高效协同工作。 2. **进程管理**:Linux内核通过调度...
下面将详细解说Linux文件系统中各个重要目录的作用和特点。 首先,根目录“/”下有若干个子目录,其中比较重要的目录包括/bin、/etc、/lost+found、/sbin、/var、/boot、/root、/home、/mnt、/tmp、/dev和/usr等。 ...
我们知道用户身份是通过 UID 来确认的,我们在 《用户(user)和用户组(group)配置文件详解》中的 UID 的解说中有谈到 UID 是确认用户权限的标识,用户登录系统所处的角色是通过UID 来实现的,而非用户名。 普通用户...
Linux通过线程、进程或者异步非阻塞I/O来实现并发。PPT可能包含这方面的内容,比如线程池和事件驱动编程模型。 8. **网络安全** 网络编程中的安全问题不容忽视,如数据加密、认证和防止拒绝服务攻击等。这部分可能...
本文详细介绍了 Linux 文件和目录的基本属性,包括 inode、权限、链接、归属、时间戳等方面的内容,并提供了相应的命令和示例,帮助用户更好地理解和管理 Linux 文件系统。 #### 12. 后记 Linux 文件系统的管理和...
我们知道用户身份是通过 UID 来确认的,我们在 《用户(user)和用户组(group)配置文件详解》中的 UID 的解说中有谈到“UID 是确认用户权限的标识,用户登录系统所处的角色是通过 UID 来实现的,而非用户名;...
关于Linux Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是...Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的
4. 启动服务:运行服务器程序启动DNS服务,通常会有一个守护进程来管理。 5. 测试与监控:使用DNS工具(如dig、nslookup)进行测试,同时设置日志和监控系统以确保服务正常运行。 总的来说,DNSPod NDS解析服务器...
5. **Linux Kernel(Linux内核)**:作为整个系统的底层,Linux内核提供了内存管理、进程调度、网络栈、驱动模型等功能,为上层提供了稳定、高效的运行环境。 ### Android 的四大组件 Android平台中有四个主要的...
整体来看,文档是对Linux中ACPI实现的一个详细技术解说,不仅涉及了ACPI的基本概念和架构,还深入到具体的内核数据结构、命名空间的管理,以及驱动程序和事件处理机制等技术细节。了解这些知识点对于深入学习Linux...
代码的详细解说将指导学生如何将理论知识应用到实际编程中,包括如何与Linux内核的调度机制相比较,以及如何优化性能。 文件"3113006030林旭东操作系统课设"很可能是包含源代码和相关文档的压缩包。解压后,学生...