进程和进程间通信

作者: 编程技术  发布:2019-09-20

程序:存放在磁盘文件下的可推行文件

  1.  /bin、/sbin、/usr/bin、/usr/sbin的区别

进程:是二个持有独立功用的次序对某些数据集结的三回运转活动。进度是前后相继的一个现实贯彻,进程是实施顺序的进程。

--bin:为binary的简写首要放置一些系列级其他奉行文书档案比方:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

实体结构:进度调节块,程序段,数据段

--/usr/bin:首要放置一些施用软件工具的必备试行档比如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb*、wget等。

经过调节块:PCB是过程存在的独一标志,是task_struct的结构体,task_struct==》结构体==》进度表项

--/sbin目录: 首要放置一些系统管理的必需程序举例:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。 

进度ID:每一个进程独有一个ID,非负整数。

--/usr/sbin目录: 放置一些网路管理的画龙点睛程序举个例子:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等

状态:有就绪,运行,挂起,停止。

 

并发:在操作系统中,是指多少个岁月段中有多少个程序都远在已运转运作到运维完结之间,且那多少个程序都是在同叁个甩卖机上运营,但任贰个时刻点上唯有七个前后相继在拍卖机上运转。

 

如浏览器,听歌,qq等还要展开,该进度须求硬件手腕时钟中断。

/  :               this is root directory

情形变量:相似是指在操作系统中用来钦定操作系统运转条件的一部分参数,以字符串“遭逢变量名=蒙受变量值”的样式贮存的,用来陈诉进度情况音信

/bin :            commands in this dir are all system installed user commands

echo $PATH 查看情况变量 结果:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 搜素路线由前到后

/sbin:            commands in this dir are all system installed super user commands

常用函数 #include<stdlib.h> getenv putenv setenv 应用时上网查阅

/usr/bin:       user commands for applications

fork函数:产生贰个子经过

/usr/sbin:      super user commands for applications

子进程的代码是父进度代码一个大同小异的正片

/usr/local/bin : application user commands

再次回到值有2个: 1、父进度重回子进度的pid (非负整数>0) 2、再次来到0

/usr/local/sbin: application super user commands

图片 1

2.

孤儿进程:父进程先于子进度截止,则子进度成为孤儿进度,子进程的父进度成为init进度,称为init进度领养孤儿进度。

 图片 2

活死人进度:: 进度终止,父进度未有回收,子进度残留能源寄放在根本中,变成活死人进程

3.

丧尸进度是不能够应用kill命令清除掉的。 因为kill命令只是用来终止进程的,而丧尸进度已经截止

经过之间的通讯:

父亲和儿子进程同步的功臣-------wait函数

--时域信号:有发送、处理、阻塞进度;处理(signal()注册管理函数);阻塞(一些函数管理功率信号集)

经过间通信 (IPC,InterProcess Communication)

--管道:实质上是四个内核缓冲区,无名氏(pipe)与老牌(FIFO) 

一、管道(使用最简便,进度间的主动脉)

--音信队列:

  1. 进度通讯必得经过基础
  2. 管道:管道是二个异样的文书,是由队列达成的,是单向的,先进先出的,无组织的字节流。
  3. 管道实为基石使用环形队列机制,借助内核缓冲区贯彻。
  4. 无名氏管道:文件系统中无文件名,无法用open文件创建,只好用pipe函数来创造管道
  5. 无名氏管道短处:不能兑现不是老爹和儿子进程之间的通讯
  6. 威名赫赫管道 :文件系统中有文件名
  7. pipe函数

    1 //函数形式: init pipe(int fd[2])2 //功能:创建管道,为系统调用3 //头文件:unistd.h4 //参数:得到的文件描述符。 fd[0]:读   出队  fd[1]:写   入队5 //返回值:成功0,出错是-1
    
     1  #include"stdio.h" 2  #include"unistd.h" 3  #include"stdlib.h" 4   int main() 5   { 6        int fd[2]; 7        int ret; 8        ret=pipe; 9        if(ret<0)10        {11            printf("creat pipe failuren");12            return -1;13        }14         printf("creat pipe sucess fd[0]=%d,fd[1]=%dn",fd[0].fd[1]); n15         return 0;16   }17
    

    输出:creat pipe sucess fd[0]=3,fd[1]=4

    注意:

--分享内部存款和储蓄器:一段共享内部存款和储蓄器能够被四个及以上的经过映射进自身的地址空间中

  • 管道是开创在内部存款和储蓄器中的,进程截至,空间释放,管道就不设有了
  • 管道的事物读完了就删除
  • 即使管道中从未东西读,则会卡住

8、进度间通信

 1 /* simplepipe.c 2  * parent read chars from stdin, then send them to child through pipe, 3  * child receive chars from pipe ,then display on stdout 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <unistd.h> 8 #define BUFSIZE 1024 9 int main(void) {10         int pid, fd[2], n;11         char buf[BUFSIZE];12         if  < 0)      //pipe创建管道13                 { printf("pipe errorn"); exit(1); }14         if ((pid = fork < 0)    //创建子进程15                 { printf("fork failuren"); exit(1); }16         else if (pid == 0) {  //child17                 close(fd[1]);18                 while((n = read(fd[0], buf, BUFSIZE))>0) {19                         write(STDOUT_FILENO, "receive from parent:  ", 21);20                         write(STDOUT_FILENO, buf, n);21                 }22                 if (n < 0)23                         { printf("read errorn"); exit(1); }24                 close(fd[0]);25                 printf("exit childn");26                 exit(0);27         }28         close(fd[0]);29         while((n=read(STDIN_FILENO, buf, BUFSIZE)) >0)30           write(fd[1], buf, n);31         if (n < 0)32                 { printf("read errorn"); exit(1); }33         close(fd[1]);34         printf("exit parentn");35         return 0;36 }37 //退出程序:crtl+c
  1. 著名管道:

透过闻明管道,不相干的进程也能调换数据,所谓知名,即文件系统中留存这些同样的文件节点,每一个文本节点都有七个inode号何况那是三个独特的文件类型:P管道类型

函数形式: int mkfifo(const char *pathname,mode_t mode)功能:创建命名管道,没有在内核中创建管道,只有通过open函数打开打开这个文件时才会在内核空间创建管道参数:路径  权限头文件:#include<sys/types.h>       #include<sys/types.h>      返回:若成功为0,若出错则为-1

管道文件独有inode号,不占磁盘快空间,和套接字、字符设备文件、块设备文件一律。普通文书和标识链接文件及目录文件,不仅唯有inode号,还占磁盘块空间。

七个进度通信:

图片 3图片 4

 1 #include "stdio.h" 2 #include "unistd.h" 3 #include "stdlib.h" 4 #include "sys/types.h" 5 #include "sys/stat.h" 6 int main() 7 { 8    int ret; 9    ret=mkfifo("./myfifo",0777);10    if(ret<0)11    {   12      printf("creat myfifo failuren");13      return -1; 14    }   15    printf("creat myfifo sucessn");16    return 0;17 }

制造管道图片 5图片 6

 1 //往管道写  2 #include "unistd.h" 3 #include "stdio.h" 4 #include "sys/types.h" 5 #include "stdlib.h" 6 #include "fcntl.h" 7 int main() 8 { 9    int fd;10    int i;11    char  process_inter=0;12    fd=open("./myfifo",O_WRONLY);//管道被创建13    if(fd<0)14    {15       printf("open myfifo failuren");16       return -1;17    }18    printf("open myfifo sucessn");19    for(i=0;i<5;i++)20    {21       printf("this is first process i =%dn",i);22       usleep(100);23    }24    process_inter=1;25    sleep(8);26    write(fd,&process_inter,1);//往管道中写27    while(1);28    return 0;29 }

first.c图片 7图片 8

 1 //接收first从管道发的数据, 执行相关操作 2 //以上三个程序放在同一文件夹中,用两个中端查看结果 3 #include "unistd.h" 4 #include "stdio.h" 5 #include "sys/types.h" 6 #include "stdlib.h" 7 #include "fcntl.h" 8 int main() 9 {10    int fd; 11    int i;12    char  process_inter=0;13    fd=open("./myfifo",O_RDONLY);14    if(fd<0)15    {   16       printf("open myfifo failuren");17       return -1; 18    }   19    printf("open myfifo sucessn");20    read(fd,&process_inter,1);21    while(process_inter==0);22    for(i=0;i<5;i++)23    {   24       printf("this is first process i =%dn",i);25       usleep(100);26    }   27    while(1);28    return 0;29 }

second.c

二、信号

  1. kill l :查看非确定性信号
  2. 时限信号是消息的载体,Linux/UNIX蒙受下,古老的、精华的通讯情势。信号是软件中断。共性:简单。无法带走大批量新闻,满足有些特设条件下才发送。
  3. 功率信号的特质:由于随机信号是因而软件方法完毕,其促成手腕导致功率信号有很强的实延性。但对于客户来讲,这一个时延相当短,不易察觉
  4. 种种进程收到的富有实信号都以由基础肩负发送的,内核管理。
  5. 频限信号四要素:编号、名称、事件、默许管理动作
  6. 递达:递达况兼达到进度
  7. 未决:产生和递达之间的气象。首倘诺因为阻塞导致这场所
  8. 信号的管理情势有:施行私下认可动作、忽略,捕捉
  9. PCB包涵实信号有关的音讯,主要是指阻塞复信号集和未决时限信号集

本文由贝博体育app发布于编程技术,转载请注明出处:进程和进程间通信

关键词: