linux基础复习(8)进程通信
发布时间:2022-10-24 15:12:00 所属栏目:Unix 来源:
导读: 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
通知事
共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
通知事
|
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)或调试程序的停止执行信号 可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。 (1) 忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。 (2) 捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。如果捕捉到SIGCHLD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态。 (3) 执行系统默认动作。对大多数信号的系统默认动作是终止该进程。 每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作: n 异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。 n 退出(exit):不产生core文件,直接终止进程。 n 忽略(ignore):忽略该信号。 n 停止(stop):挂起该进程。 n 继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。 [b]信号发送与捕捉[/b] kill()和raise() kill()不仅可以中止进程,也可以向进程发送其他信号。 与kill函数不同的是,raise()函数运行向进程自身发送信号。 #i nclude #i nclude int kill(pid_t pid, int signo) ; int raise(int signo) ; 两个函数返回:若成功则为0,若出错则为-1。 kill的pid参数有四种不同的情况: (编辑:PHP编程网 - 钦州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐

浙公网安备 33038102330484号