码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-05-08 01:03:08      阅读:361      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   ext   

1. fork 创建新进程

fork创建的新进程称为子进程,fork函数调用一次,返回两次。
两次返回的唯一区别就是子进程的返回值是0,而父进程的返回值是新子进程的进程ID
在fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核的调度算法
 
fork的一个特性就是父进程的所有打开文件描述符都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项
bubuko.com,布布扣
 
在fork之后处理文件描述符有两种常见情况:
(1)父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理,因为子进程读写共享描述符的文件偏移量已经执行了相应更新
(2)父子进程各自执行不同的程序段。在这种情况下,在fork之后,父子进程各自关闭它们不需要使用的文件描述符,常见于网络服务进程
 
一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程被称为 僵死进程
 
2. wait和waitpid函数
当一个进程正常或异常终止时,内核向其父进程发送SIGCHLD信号,子进程终止是异步事件(可以在父进程运行的任何时候发生),这个信号也就是异步通知
调用wait或waitpid时,如果其所有子进程都还在运行,那么调用会阻塞
waitpid函数中,如果pid == -1 那么等待任一子进程,相当于wait函数;如果pid > 0 ,那么等待其进程ID与pid相等的子进程
 
3.exec函数
调用exec并不创建新进程,前后的进程ID并未改变,只是用一个全新的程序替换了当前程序
bubuko.com,布布扣
bubuko.com,布布扣
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    extern char** environ;
    for (int i = 0; i < argc; ++i) {
        fprintf(stdout, "argv[%d] : %s\n", i, argv[i]);
    }
    for (char** ptr = environ; *ptr != NULL; ++ptr) {
        fprintf(stdout, "%s\n", *ptr);
    }
    return 0;
}
bubuko.com,布布扣

 

4.进程时间

bubuko.com,布布扣
clock_t times(struct tms *buf);
struct tms {
    clock_t tms_utime;    /* user time */
    clock_t tms_stime;    /* system time */
    clock_t tms_cutime;  /* user time of children */
    clock_t tms_cstime;  /* system time of children */
};
bubuko.com,布布扣

 

APUE 学习笔记(六) 进程控制,布布扣,bubuko.com

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

标签:style   blog   class   code   java   ext   

原文地址:http://www.cnblogs.com/wwwjieo0/p/3714780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!