进程控制编程

来源:互联网 发布:linux cpu 超过100 编辑:程序博客网 时间:2024/06/05 07:28

进程与程序

进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制

进程是暂时的,程序使长久的:进程是一个状态变化的过程,程序可长久保存

进程与程序组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)

进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。

“数据段”存放的是全局变量、常数以及动态数据分配的数据空间;
“代码段”存放的是程序代码的数据。
“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。

僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸。

僵尸进程产生的过程:
1. 父进程调用fork创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。

  1. 子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD 信号,父进程此时应该调用 wait() 系统调用来获取子进程的退出状态以及其它的信息。在 wait 调用之后,僵尸进程就完全从内存中移除。

  2. 因此一个僵尸存在于其终止到父进程调用 wait 等函数这个时间的间隙,一般很快就消失,但如果编程不合理,父进程从不调用 wait 等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。

课堂练习:
/***************************************************************

File Name: 6.c
Author: 浮生流年
Function List: main() 主函数
Created Time: 2017年12月06日 星期三 14时39分59秒
**************************************************************/

#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#include<stdlib.h>
void child_write(){    int fd, ret;    char buf[100] = {0};    fd = open("test.txt", O_WRONLY | O_CREAT | O_EXCL, S_IRWXU);    if(-1 == fd)    {        perror("open1");        exit(1);    }    while (1)    {        scanf("%s", buf);        ret = write(fd, buf, strlen(buf));        if (-1 == ret)        {            perror("write");            exit(1);        }        if (!strncmp(buf, "end", 3))  //判断输入结束        {        break;        }        memset(buf, 0, sizeof(buf));    }}
void parent_read(){    int fd, ret;    char buf[100] = {0};    fd = open("test.txt", O_RDONLY);    if (-1 == fd)    {        perror("open2");        exit(1);    }    while (1)    {        ret = read(fd, buf, sizeof(buf));        if (-1 == ret)        {            perror("read");            exit(1);        }        else if (0 != ret)   //判断是否读到内容        {            if (!strncmp(buf, "end", 3)) //当读到end时停止            {                break;            }            printf("read from txt : %s", buf);        }        memset(buf, 0, sizeof(buf));    }}
int main(){    pid_t pid;    pid = fork();    if (-1 == pid)    {        perror("fork");        exit(1);    }    else if (0 == pid)//子进程    {        child_write();    }    else              //父进程    {        parent_read();    }    return 0;}