微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > linux基础复习(8)进程通信

linux基础复习(8)进程通信

时间:10-08 来源:互联网 点击:

se()十分相似。

库函数: pclose();

原型: int pclose( FILE *stream );

返回值: 返回系统调用wait4( )的状态。

如果stream无效,或者系统调用wait4( )失败,则返回 -1。

注意此库函数等待管道进程运行结束,然后关闭文件流。

库函数pclose( )在使用popen( )创建的进程上执行wait4( )函数。当它返回时,它将破坏管道和文件系统。

#i nclude

#i nclude

#i nclude

#i nclude

#define BUFSIZE 1024

int main()

{

FILE *fp;

char *cmd = ps -ef;

char buf[BUFSIZE];

buf[BUFSIZE] = '\0';

if((fp=popen(cmd,r))==NULL)

perror(popen);

while((fgets(buf,BUFSIZE,fp))!=NULL)

printf(%s,buf);

pclose(fp);

exit(0);

}

[b]命名管道([/b][b]FIFO[/b][b])[/b]

命名管道和一般的管道基本相同,但也有一些显著的不同:

n 命名管道是在文件系统中作为一个特殊的设备文件而存在的。

n 不同祖先的进程之间可以通过管道共享数据。

n 当共享管道的进程执行完所有的I / O操作以后,命名管道将继续保存在文件系统中以便以后使用。

管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是,通过FIFO,不相关的进程也能交换数据。

命名管道创建

#i nclude

#i nclude

int mkfifo(const char * pathname,

mode_t mode) ;

返回:若成功则为0,若出错则为- 1

一旦已经用mkfifo创建了一个FIFO,就可用open打开它。确实,一般的文件I / O函数(close、read、write、unlink等)都可用于FIFO。

当打开一个FIFO时,非阻塞标志(O_NONBLOCK)产生下列影响:

(1) 在一般情况中(没有说明O_NONBLOCK),只读打开要阻塞到某个其他进程为写打开此FIFO。类似,为写而打开一个FIFO要阻塞到某个其他进程为读而打开它。

(2) 如果指定了O_NONBLOCK,则只读打开立即返回。但是,如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。

类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。

FIFO相关出错信息:

n EACCES (无存取权限)

n EEXIST (指定文件不存在)

n ENAMETOOLONG (路径名太长)

n ENOENT (包含的目录不存在)

n ENOSPC (文件系统剩余空间不足)

n ENOTDIR (文件路径无效)

n EROFS (指定的文件存在于只读文件系统中)

[b]信号通信[/b]

信号是软件中断。信号(signal)机制是Unix系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。

很多条件可以产生一个信号。

n 当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGINT)。这是停止一个已失去控制程序的方法。(第11章将说明此信号可被映射为终端上的任一字符。)

n 硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效存储访问的进程产生一个SIGSEGV。

n 进程用kill( 2 )函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。

n 用户可用kill( 1 )命令将信号发送给其他进程。此程序是kill函数的界面。常用此命令终止一个失控的后台进程。

n 当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被0除),而是软件条件。例如SIGURG (在网络连接上传来非规定波特率的数据)、SIGPIPE (在管道的读进程已终止后一个进程写此管道),以及SIGALRM(进程所设置的闹钟时间已经超时)。

内核为进程生产信号,来响应不同的事件,这些事件就是信号源。主要的信号源如下:

n 异常:进程运行过程中出现异常;

n 其它进程:一个进程可以向另一个或一组进程发送信号;

n 终端中断:Ctrl-C,Ctrl-\等;

n 作业控制:前台、后台进程的管理;

n 分配额:CPU超时或文件大小突破限制;

n 通知:通知进程某事件发生,如I/O就绪等;

n 报警:计时器到期。

下面是几个常见的信号。

n SIGHUP: 从终端上发出的结束信号;

n SIGINT: 来自键盘的中断信号(Ctrl-C);

n SIGQUIT:来自键盘的退出信号(Ctrl-\);

n SIGFPE: 浮点异常信号(例如浮点运算溢出);

n SIGKILL:该信号结束接收信号的进程;

n SIGALRM:进程的定时器到期时,发送该信号;

n SIGTERM:kill 命令发出的信号;

n SIGCHLD:标识子进程停止或结束的信号;

n SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号

可以要求系统在某个信号出现时

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top