进程间通信-信号-pipe-fifo(课上测试,选做)
如图:



已经将代码全部写入linux
fifo
编译每个源代码文件:(testmf=test;consumer=csm;producer=prd)
使用 gcc -o consumer consumer.c 编译 consumer.c。
使用 gcc -o producer producer.c 编译 producer.c。
使用 gcc -o testmf testmf.c 编译 testmf.c。
运行测试程序:
首先运行 ./testmf 以创建FIFO。
运行生产者和消费者程序:
在一个终端窗口运行 ./producer。
在另一个终端窗口运行 ./consumer。
这将演示生产者如何向FIFO写入数据,以及消费者如何读取这些数据。

pipe
listargs.c:
这个程序打印它接收到的所有命令行参数。
它遍历参数数组并打印每个参数,还会向标准错误输出(stderr)发送一条消息。

pipe.c:
这个程序演示了如何在两个命令之间创建管道。
它创建一个管道,然后使用 fork() 分叉进程。父进程执行一个命令并将输出发送到管道,子进程执行另一个命令并从管道接收输入。

使用./pipe ls grep [搜索词]
./pipe cat sort < [文件名]
这两个命令。
pipedemo.c:
此程序创建一个管道,并演示了如何向管道写入数据并从管道读取数据。
用户可以从标准输入(stdin)输入数据,程序将这些数据写入管道,然后从管道中读取并打印。

pipedemo2.c:
这个程序创建了一个管道,并通过 fork() 分叉进程。
子进程定期向管道写入消息,父进程则从管道读取这些消息。

stdinredir1.c:
这个程序演示了如何重定向标准输入(stdin)。
它首先从标准输入读取几行数据,然后关闭标准输入的文件描述符并打开 /etc/passwd 文件,之后再次尝试从标准输入读取数据(此时应从新打开的文件中读取)。

stdinredir2.c:
类似于 stdinredir1.c,但展示了使用 dup 和 dup2 系统调用的不同方法来实现文件描述符的复制和重定向。
建了一个data的txt文件,内容是:miaojingzhang666,测试如图:

testtty.c:
这个简单的程序尝试向标准输入(通常是键盘)写入数据,这通常不是预期的行为。

whotofile.c:
该程序创建了一个子进程,子进程关闭其标准输出(stdout),打开一个名为 userlist 的文件,并执行 who 命令,将输出重定向到该文件中。
父进程等待子进程完成,然后打印一条消息表示 who 命令的输出已保存在 userlist 文件中。

signal
sigactdemo.c:
这个程序设置了一个信号处理函数来处理 SIGINT(通常是由 Ctrl+C 触发的中断信号)。
使用了 sigaction 来更精确地控制信号处理的行为,如忽略特定信号、设置信号处理函数等。
当用户按下 Ctrl+C 时,程序将调用 inthandler 函数。
sigactdemo2.c:
这个程序演示了如何使用信号来实现简单的睡眠功能。
它定义了一个处理 SIGALRM(由 alarm 函数触发的信号)的处理函数,但该函数不执行任何操作。
mysleep 函数设置一个计时器,暂停程序执行直到信号到达。

(前两个程序)
sigdemo1.c:
这个程序为 SIGINT 信号设置了一个简单的处理函数。
当用户按下 Ctrl+C 时,程序将打印 "OUCH!" 而不是终止。
sigdemo2.c:
这个程序演示了如何忽略 SIGINT 信号。
即使用户尝试通过按 Ctrl+C 来中断程序,程序也会继续运行。

(第3、4个程序)
sigdemo3.c:
这个程序为 SIGINT 和 SIGQUIT 信号设置了处理函数。
它允许用户输入消息,然后通过捕捉和处理这些信号来响应 Ctrl+C 和 Ctrl+\ 的按键

结合代码说明pipe 和 fifo的不同
Pipe(管道)
定义与特性:
- 管道是一种临时的、存在于内存中的IPC机制。
- 它通常用于父子进程或者同一祖先进程创建的兄弟进程之间的通信。
- 数据在管道中单向流动,从写入端到读取端。
代码实例(如 pipe.c, pipedemo.c):
- 在这些程序中,管道通过
pipe()系统调用创建。 - 通常,父进程会创建一个管道,然后通过
fork()创建一个子进程,其中一个进程负责写入,另一个进程负责读取。 - 管道的生命周期通常与创建它的程序一样长。
使用场景:
- 用于需要临时通信的场景,例如在父子进程之间传递数据。
FIFO(命名管道)
定义与特性:
- FIFO是一种命名的管道,它在文件系统中有一个实际的入口。
- 它允许没有血缘关系的进程之间进行通信。
- 和管道类似,数据在FIFO中单向流动。
代码实例(如 consumer.c, producer.c):
- 在这些程序中,FIFO通过
mkfifo()系统调用创建。 - FIFO被创建为文件系统中的一个特殊文件,因此它的生命周期独立于创建它的程序。
- 不同的进程可以打开这个FIFO文件进行读写操作,实现进程间通信。
使用场景:
- 用于需要长期、持久化通信的场景,特别是在不相关的进程之间。
总结
- 总的来说,管道是一种只存在于内存中的短暂通信方式,而FIFO则是一种持久化的、基于文件系统的通信方式。管道通常用于有血缘关系的进程间通信(如父子进程),而FIFO可以在任何进程间提供通信,只要这些进程可以访问同一个FIFO文件。

浙公网安备 33010602011771号