linux基础复习(8)进程通信
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)或调试程序的停止执行信号
可以要求系统在某个信号出现时
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)