每个进程都有一个非负整形表示的唯一进程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函数

一个进程可以调用fork来创建新的进程。
pid_t    fork(void)
#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函数

vfork函数的调用序列和返回值与fork相同。但两个语义不同。
vfork可以保证子进程的先与父进程执行。它调用exec或者exit之后父进程才可能被调度执行。
vforktest.c:
#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函数

当一个进程正常或者异常终止时,内核就向其父进程发送SIGCHLD信号。
父进程可以忽略这个信号或者调用一个执行的函数。系统默认是忽略它。
pid_t   wait(int  *statloc)
pid_t   waitpid( pid_t   pid,  int   *statloc,   int   options)
若成功返回进程ID,出错则返回-1。
下面为关于子进程退出状态的操作.
exittest.c:
#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函数就返回。

waitpid用于等待一个指定的进程终止。
pid_t   waitpid(pid_t  pid,  int   *statloc,  int   options);
如果pid = -1  等待任一进程终止,此时与wait等效。
pid > 0 等待其进程ID与pid相等的子进程。
pid  == 0  等待其组ID等于调用进程组ID的任一子进程。
pid  < -1  等待组ID等于pid绝对值得任一子进程。















AUPE学习第八章------进程控制的更多相关文章

  1. apue学习笔记(第八章 进程控制)

    本章介绍UNIX系统的进程控制,包括创建新进程.执行程序和进程终止. 进程标识 每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符.下列函数返回这些标识符 #inc ...

  2. 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制

    8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...

  3. Linux C语言编程学习笔记 (1)进程控制入门

    想进行Linux系统开发已经很久了,一直没有付诸实践.今日终于开始学习Linux下的C语言编程,研究一天,终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法,总结下来以方便大家学习和自己实 ...

  4. linux学习笔记-13.进程控制

    1.查看用户最近登录情况 lastlastlog 2.查看硬盘使用情况 df 3.查看文件大小 du 4.查看内存使用情况 free 5.查看文件系统 /proc 6.查看日志 ls /var/log ...

  5. APUE第八章-进程控制

    一.进程标识 二.函数fork 1.写时复制,copy-on-write 2.文件共享,父进程等待子进程完成,子进程结束后,它对任一共享描述符的读写操作的文件偏移量已做相应的更新,同时操作时,可以考虑 ...

  6. APUE 学习笔记(六) 进程控制

    1. fork 创建新进程 fork创建的新进程称为子进程,fork函数调用一次,返回两次. 两次返回的唯一区别就是子进程的返回值是0,而父进程的返回值是新子进程的进程ID 在fork之后是父进程先执 ...

  7. UNIX环境编程学习笔记(18)——进程管理之进程控制三部曲

    lienhua342014-10-05 1 进程控制三部曲概述 UNIX 系统提供了 fork.exec.exit 和 wait 等基本的进程控制原语.通过这些进程控制原语,我们即可完成对进程创建.执 ...

  8. Linux网络编程学习(三) ----- 进程控制实例(第三章)

    本节主要介绍一个进程控制的实例,功能就是在前台或者后台接收命令并执行命令,还能处理由若干个命令组成的命令行,该程序命名为samllsh. 基本逻辑就是 while(EOF not typed) { 从 ...

  9. Linux网络编程学习(二) ----- 进程控制(第三章)

    1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...

随机推荐

  1. hihoCoder hiho一下 第四十八周 题目1 : 拓扑排序·二

    题意: 给定一个拓扑图,其中部分结点含有1个病毒,每个结点只要收到病毒就会立即往出边所能到达的点传播,病毒数可叠加,求所有结点的病毒数总和. 思路: 根据拓扑的特点,每个入度为0的点肯定不会再被传播病 ...

  2. android中handler用法总结

    一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...

  3. LA 2995 Image Is Everything 立方体成像 World Final 2004

    有一个 n * n * n 的立方体,其中一些单位立方体已经缺失(剩下部分不一定连通).每个单位立方体重 1 克,且被涂上单一的颜色(即 6 个面的一颜色相同).给出前.左.后.右.顶.底 6 个视图 ...

  4. ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别

    工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadP ...

  5. EL表达式(胖先生版)

    EL表达式没有指定范围,从最小范围开始 <% pageContext.setAttribute("shxt", "java web"); request. ...

  6. 【转】C# 委托的介绍(delegate、Action、Func、predicate)

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Delegat ...

  7. php-LAMP试题

    ylbtech-doc:php-LAMP试题 LAMP试题 1.A,LAMP试题返回顶部 1.{PHP LAMP题目}变量$email的值是字符串 user@example.com ,以下哪项能把字符 ...

  8. Java并发编程-总纲

    Java 原生支持并发,基本的底层同步包括:synchronized,用来标示一个方法(普通,静态)或者一个块需要同步执行(某一时刻,只允许一个线程在执行代码块).volatile,用来标识一个变量是 ...

  9. Delphi VclSkin使用教程

    1. TSkinData   TSkinData 主要用于美化你的程序, 只要把TSkinData控件放下去,它就能自动美化所有窗体. 属性 Active: 使用或取消对程序的美化. DisableT ...

  10. php获取网站根目录

    php获取网站根目录方法一:<?phpdefine("WWWROOT",str_ireplace(str_replace("/","\\&quo ...