AUPE学习第八章------进程控制
每个进程都有一个非负整形表示的唯一进程ID。
init进程是一号进程,是第一个用户态的进程。它负责内核启动以后启动一个unix系统,
它读取的配置文件一般在/etc/rc*、/etc/inittab、/etc/init.d中。
下面的函数返回进程的一些标识:
pid_t getpid(void) //调用进程的进程ID.
pid_t getppid(void) //调用进程的父进程。
uid_t getuid(void) //返回调用进程的实际用户ID。
uid_t geteuid(void) //返回用户的有效用户id
uid_t getgid(void) //调用进程的实际用户组ID。
gid_t getegid(void) //调用进程的实际组ID。
8.3fork函数
#include "apue.h" int glob = 6;
char buf[] = "a write to stdout\n";
int main(void)
{
int var;
pid_t pid;
var = 88;
if (write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)
err_sys("write error");
printf("before fork\n");
if ((pid = fork()) < 0)
{
err_sys("fork error");
}else if (pid == 0)
{
glob++;
var++;
}else
{sleep(2);
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
[root@localhost apue]# ./a.out
a write to stdout
before fork
pid = 7656, glob = 7, var = 89
pid = 7655, glob = 6, var = 88
[root@localhost apue]# ./a.out >fort.out
[root@localhost apue]# cat fort.out
a write to stdout
before fork
pid = 7671, glob = 7, var = 89
before fork
pid = 7670, glob = 6, var = 88
父进程和子进程共享打开的文件。子进程把父进程的所有打开的文件描述符都复制到子进程中。
8.4vfork函数
#include "apue.h"
int glob = 6;
int main()
{
int var;
pid_t pid;
var = 88;
printf("before vfork\n");
if ((pid = vfork()) < 0){
err_sys("vfork error");
}else if (pid == 0){
glob++;
var++;
_exit(0);
}
printf("pid = %d, glob = %d, var = %d\n", getpid, glob, var);
exit(0);
}
[root@localhost apue]# vim vforktest.c
[root@localhost apue]# gcc vforktest.c
[root@localhost apue]# ./a.out
before vfork
pid = 134513812, glob = 7, var = 89
8.6wait和waitpid函数
#include "apue.h"
#include <sys/wait.h> void pr_exit(int status);
int main(void)
{
pid_t pid;
int status;
if ((pid = fork()) < 0)
err_sys("error fork");
else if (pid == 0)
exit(7);
if (wait(&status) != pid)
err_sys("wait error");
pr_exit(status); if ((pid = fork()) < 0)
err_sys("error fork");
else if (pid == 0)
abort();
if (wait(&status) != pid)
err_sys("wait error");
pr_exit(status); if ((pid = fork()) < 0)
err_sys("error fork");
else if (pid == 0)
status /= 0;
if (wait(&status) != pid)
err_sys("wait error");
pr_exit(status); exit(0);
} void pr_exit(int status)
{
if (WIFEXITED(status))
printf("normal termination,exit status = %d\n", WEXITSTATUS(status));
else if (WIFSIGNALED(status))
printf("abnormal termination, signal number = %d%s\n",WTERMSIG(status),
#ifdef WCOREDUMP
WCOREDUMP(status) ? " (core file generated)" : "");
#else
"");
#endif
else if (WIFSTOPPED(status))
printf("child stopped, signal number = %d\n", WSTOPSIG(status));
}
[root@localhost apue]# vim exittest.c
[root@localhost apue]# gcc exittest.c
exittest.c: In function ‘main’:
exittest.c:28: 警告:被零除
[root@localhost apue]# ./a.out
normal termination,exit status = 7
abnormal termination, signal number = 6
abnormal termination, signal number = 8
如果一个进程有几个子进程,name只要有一个子进程终止,wait函数就返回。
AUPE学习第八章------进程控制的更多相关文章
- apue学习笔记(第八章 进程控制)
本章介绍UNIX系统的进程控制,包括创建新进程.执行程序和进程终止. 进程标识 每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符.下列函数返回这些标识符 #inc ...
- 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制
8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...
- Linux C语言编程学习笔记 (1)进程控制入门
想进行Linux系统开发已经很久了,一直没有付诸实践.今日终于开始学习Linux下的C语言编程,研究一天,终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法,总结下来以方便大家学习和自己实 ...
- linux学习笔记-13.进程控制
1.查看用户最近登录情况 lastlastlog 2.查看硬盘使用情况 df 3.查看文件大小 du 4.查看内存使用情况 free 5.查看文件系统 /proc 6.查看日志 ls /var/log ...
- APUE第八章-进程控制
一.进程标识 二.函数fork 1.写时复制,copy-on-write 2.文件共享,父进程等待子进程完成,子进程结束后,它对任一共享描述符的读写操作的文件偏移量已做相应的更新,同时操作时,可以考虑 ...
- APUE 学习笔记(六) 进程控制
1. fork 创建新进程 fork创建的新进程称为子进程,fork函数调用一次,返回两次. 两次返回的唯一区别就是子进程的返回值是0,而父进程的返回值是新子进程的进程ID 在fork之后是父进程先执 ...
- UNIX环境编程学习笔记(18)——进程管理之进程控制三部曲
lienhua342014-10-05 1 进程控制三部曲概述 UNIX 系统提供了 fork.exec.exit 和 wait 等基本的进程控制原语.通过这些进程控制原语,我们即可完成对进程创建.执 ...
- Linux网络编程学习(三) ----- 进程控制实例(第三章)
本节主要介绍一个进程控制的实例,功能就是在前台或者后台接收命令并执行命令,还能处理由若干个命令组成的命令行,该程序命名为samllsh. 基本逻辑就是 while(EOF not typed) { 从 ...
- Linux网络编程学习(二) ----- 进程控制(第三章)
1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...
随机推荐
- [asp.net] 通过JS实现对treeview控件的复选框单选控制。
前端JS代码: //识别不同的浏览器 function getTargetElement(evt) { var elem if (evt.target) { elem = (evt.target.no ...
- Spark 问题总结
1 创建hive外部表 其实这个问题应该是hive的问题.就是外部表在创建的时候需要指定目录.举例说明 我们要创建一个外部表,其来源是test_tab这个文件,那么在LOCATION处是不是这样写呢? ...
- RandomAccessFile、FileChannel、MappedByteBuffer读写文件
s package com.nio; import java.io.Closeable; import java.io.FileNotFoundException; import java.io.IO ...
- 插件二之页面加载进度条pace.js
关于pace.js pace.js包含14样式,每种样式可以自定义颜色,官方下载中提供了几种颜色的主题,使用方式也很简单,引入pace的js文件跟所需样式文件即可 <link rel=" ...
- 九度 Online Judge 之《剑指 Offer》一书相关题目解答
前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...
- Asp.Net学习进度备忘(第一步:ASP.NET Web Forms)
书签:“Web Pages”和“MVC”跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1.ASP. ...
- bzoj1833 digit
这道题其实挺水,只是写的时候需要想清楚.我的方法是: 1.将[a,b]转化为[0,b+1)-[0,a) 2.预处理出非0的v在区间[0,10^p)出现次数以及0在区间[0,10^p)出现数 3.将一个 ...
- ansible playbook最佳实践
本篇主要是根据官方翻译而来,从而使简单的翻译,并没有相关的实验步骤,以后文章会补充为实验步骤,此篇主要是相关理论的说明,可以称之为中文手册之一,具体内容如下: Ansible playbooks最佳实 ...
- 关于Activity的少许细节
1. 对活动应用样式和主题 2. 隐藏活动标题 3. 显示对话框窗口 4. 显示进度对话框 1. 应用样式和主题 改成 android:theme="@android:style/Th ...
- bzoj 3594 [Scoi2014]方伯伯的玉米田(DP+二维BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题意] 给定一个n个数的序列,有K次将一个区间内的数加1的机会,问最长不下降子 ...