掌握管道通信的编程与linux信号的编程
习题1 :用fork ()创建一个子进程,父进程接收键盘的输入,然后将输入内容通过管
道传给子进程,子进程将收到的信息显示出来。
习题2:做两个程序,程序1接收到SIGUSR1 言号时显示一行信息:"sigusrl signal received", 程序2每隔两秒钟发送一个 SIGUSR1 言号给程序1。
习题1代码:
Linux终端下:
$ vi gd.c
i
#include
#include
#include
main()
{
int pid;
int fd[2];
char buf[100];
char w[100];
int len;
pipe(fd); // 创建一个管道,产生的两个描述符,分别赋值给 fd[0]和fd[1], 一个是读描述符,一个
//是写描述符
pid=fork();// 创建一个进程
/*注意:子进程和父进程的执行顺序是随机的,若先执行子进程的话,会读到
len=read(fd[0],buf,100); 卡住,因为管道中还没有东西写入,因而会去执行父进程当父进 程执行完管道中有写如东西后在回来执行 len=read(fd[0],buf,100); 以下的语句*/
//子进程
if (pid==0)
{
close(fd[1]);// 关闭管道的写入端
//从管道的读入端将管道中的内容读入到 buf数组中,其大小为100,并将其读入数的长度赋值给len
len=read(fd[0],buf,100);
//变成完整的字符串数组
buf[len]= '\0' ;
printf( "child:%s\n" ,buf);// 输出字符串数组
close(fd[0]);// 关闭管道的读出端
}
else
{
close(fd[0]); // 关闭管道的读出端
printf( "father write:" );
scanf( "%s",&w);
write(fd[1],w, sizeof (w));// 将输入的随意字符串写入到管道中 close(fd[1]);
}
}
//按"esc”输入”:wq ”退出vi模式
$ gcc -o gdd gd.c
$ ./gdd
//显示的结果如下:
1*1 the r 说t l M:」盘
[u$er2@localho£t uier2]$ ch iId:Aid
习题2代码: Linux终端下: $ vi js.c //接收信号文件
i #include
main() {
int pid,id; pid=fork(); if (pid!=0) { id=getpid(); // 获取父进程号
printf( "produce id=%d\n" ,id); // 将父进程号给输出,以便使发送端能获取
for (;;) // 定义一个死循环,使其能够一直的等待获取发送端发送命令
{
/*若发送端发送的是SIGUSR信号(SIGUSR信号用于用户自定义的预留信号,可由用户在应用程序中 自行定义)那就执行term函数,如果其接受到的值为SIG_ER睫示没有接受到*/ if (signal(SIGUSR1,&term)==SIG_ERR) printf( "couldn't register\n" );
} } }
//为信号的处理函数,其内容是输出一条语句表示已经接受到 sigusrl的信号
void term( int sig)
(
printf( "sigusrl signal received\n" );
)
//按"esc”输入”:wq ”退出vi模式
$ gcc -o jj js.c
$ ./jj
//结果如下:
thm I g 一口 j j j a
thos; I u«;eir2]$ ./j j
pioduce idWll&
//在linux终端的菜单栏中点击“文件”-“新建窗口” - “default ”创建一个新的终端其中代码如下
$ vi fs.c // 发送信号端文件
i
#include
#include
#include
#include
#include
( int i;
//在其中输入2118,是获取接受端的进程号
//然后看第一个终端,其结果
sigusrl « igiu E rec ived
sigusrl igiu I rece ived
〈igugrl &ign食 I ived
s ci筒 ma I roet ivtd
本文来源:https://www.2haoxitong.net/k/doc/dfe6c7a1edf9aef8941ea76e58fafab068dc4429.html
文档为doc格式