这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的。
实验题目:Linux环境下的进程间通信
实验目的:熟悉进程通信中信号概念及信号处理;掌握进程间的管道通信编程;了解进程间的内存共享编程。
实验内容:
一、信号
设计程序,满足如下要求:
1、编程程序:每隔1秒显示“running….”一次,显示8次后,程序结束。应用函数alarm,在程序开始运行5秒后发送信号SIGALRM,并实现:1)程序接收到SIGALRM信号就被终止;2)自定义信号处理函数,在程序接收到SIGALRM信号后,循环显示三次“handling SIGALRM”。
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<signal.h>
4 #include<stdlib.h>
5 int main()
6 {
7 alarm(5);
8 int i;
9 for(i=0;i<=7;i++)
10 {
11 printf("running…\n");
12 sleep(1);
13 }
14 return 0;
15 }
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<signal.h>
4 #include<stdlib.h>
5 void fun()
6 {
7 int i=0;
8 for(i=0;i<=2;i++)
9 {
10 printf("handling SIGALRM \n");
11 }
12 }
13 int main()
14 {
15 (void)signal(SIGALRM,fun);
16 alarm(5);
17 int i;
18 for(i=0;i<=7;i++)
19 {
20 printf("running…\n");
21 sleep(1);
22 }
23 return 0;
24 }
2、设计一个程序,要求用户进程创建一个子进程,子进程发送SIGSTOP将自身挂起,父进程向子进程发出SIGKILL信号,子进程收到此信号,结束子进程的运行。
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<signal.h>
5 int main()
6 {
7 pid_t pid;
8 pid=fork();
9 int ret;
10 if(pid <0)
11 {
12 printf("Error Exit!\n");
13 exit(1);
14 }
15 else if(pid==0)
16 {
17 raise(SIGSTOP);
18 exit(0);
19 }
20 else
21 {
22 printf("子进程的进程号是:%d\n",pid);
23 if(waitpid(pid,NULL,WNOHANG)==0)
24 {
25 if(ret=kill(pid,SIGKILL)==0)
26 {
27 ptintf("fun kill's return is %d,pid is%d\n",ret,pid);
28 }
29 }
30 }
31 return 0;
32 }
3、设计一个程序,要求程序运行后进入无限循环,要求主程序运行时,即使用户按下中断键(Ctrl+Z和Ctrl+\),也不能影响正在运行的程序,即让信号处于阻塞状态,当主体程序运行完毕后才进入自定义信号处理函数,当用户再次按下中断键(Ctrl+Z和Ctrl+\)后,结束程序运行。
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<signal.h>
4 #include<sys/types.h>
5 #include<stdlib.h>
6 void fun_z()
7 {
8 printf("you press Ctrl+z\n");
9 printf("Ctrl + z is useable now!\n");
10 signal(SIGTSTP,SIG_DFL);
11
12 }
13 void fun_d()
14 {
15 printf("you press 'Ctrl+\' \n");
16 printf("Ctrl + d is useable now!\n");
17 signal(SIGQUIT,SIG_DFL);
18
19 }
20 int main()
21 {
22 int i;
23 sigset_t set,pendset;
24 struct sigaction action;
25 signal(SIGTSTP,fun_z);
26 signal(SIGQUIT,fun_d);
27 if(sigemptyset(&set)<0)
28 perror("init sign error!");
29 if(sigaddset(&set,SIGTSTP)<0)
30 perror("add ctrl+z error!\n");
31 if(sigaddset(&set,SIGQUIT)<0)
32 perror("ass 'ctrl+\' error!\n");
33 while(1)
34 {
35 printf("Ctrl +z and 'Ctrl +\' is zuse!\n");
36 sleep(2);
37 }
38
39 return 0;
40 }
二、管道
1、设计一个程序,要求创建一个管道,复制进程,父进程往管道中写入字符串“how are you!”,子进程从管道中读取并输入字符串“how are you!”。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/types.h>
4 #include<sys/wait.h>
5 #include<unistd.h>
6 #include<string.h>
7 int main()
8 {
9 pid_t result;
10 int n;
11 int pipe_fd[2];
12 char buf1[100],buf2[100];
13 memset(buf1,0,sizeof(buf1));
14 if(pipe(pipe_fd)<0)
15 {
16 printf("error!\n");
17 return -1;
18 }
19 result=fork();
20 if(result<0)
21 {
22 printf("error!\n");
23 exit(0);
24 }
25 else if(result==0)
26 {
27 close(pipe_fd[1]);
28 if((n =read(pipe_fd[0],buf1,100))>0)
29 {
30 printf("child read %d char,char is %s\n",n,buf1);
31 close(pipe_fd[0]);
32 exit(0);
33 }
34 }
35 else
36 {
37 close(pipe_fd[0]);
38 printf("please input pipe word \n");
39 fgets(buf2,sizeof(buf2),stdin);
40 if(write(pipe_fd[1],buf2,strlen(buf2))!=-1)
41 printf("parent write to child is: %s\n",buf2);
42 close(pipe_fd[1]);
43 waitpid(result,NULL,0);
44 exit(0);
45 }
46
47 return 0;
48 }
2、设计一个程序,要求用popen创建管道,实现“rpm -qa | grep nfs”的功能。
3、设计一个程序,要求创建一个管道PIPE,复制进程,父进程运行命令“ls –l”,把运行结果写入管道,子进程从管道中读取“ls -l”的结果,把读出的作为输入接着运行“grep .c”。
三、共享内存
1、设计一个程序,要求创建进程,父子进程通过匿名映射实现共享内存。