Linux实验4管道通信

发布时间:2020-11-15 22:13:51   来源:文档文库   
字号:

实验四管道通信与信号

试验目的:

掌握管道通信的编程与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 iIdAid

习题2代码: Linux终端下: $ vi js.c //接收信号文件

i #include #include #include #include #include void term( int sig); // 申明一个自定义信号处理函数

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 main()

( int i;

//在其中输入2118,是获取接受端的进程号

//然后看第一个终端,其结果

sigusrl « igiu E rec ived

sigusrl igiu I rece ived

igugrl &ign I ived

s cima I roet ivtd

本文来源:https://www.2haoxitong.net/k/doc/dfe6c7a1edf9aef8941ea76e58fafab068dc4429.html

《Linux实验4管道通信.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式