Unix编程小结(限于实验范围)
实验很快搞定了,学到了不少东西,当时我知道Unix编程不是这么几个简单的实验,但是已经对我来说不是那么陌生,突然发现Unix下的编程是十分简洁高效的!当然也因为不用考虑图形界面的设计,摆脱了不少看似简单但是十分麻烦的问题。但是这次主要是用c编程,而且实验实在太小了,也没用上啥面向对象思想,纯属玩弄c语言技巧了。当然也验证了一句话:“当你对c的经验增加时,她会显得十分的好用。”
(一)创建进程
fork()函数。使用简单明了,书上已经说了很多了。但是课本上的使用方法太没章法了,首先他定义pid用的是int,这是没什么问题,但是很不直观,不然用pid_t直观。其次,他对进程创建失败的处理可以说就没有,而且创建多个进程就多层嵌套了,很容易出错,这里也不贴这种不易维护的代码了,先看看我是如何练习这一项的。代码节选如下:
2 if((pid=fork())>0){
3 fprintf(stderr,"Parent pid=[%d],child pid=[%d]\n",getpid(),pid);
4 }
5 else if(pid==0)
6 {
7 fprintf(stderr,"Child pid=[%d]\n",getpid());
8 i++;
9 }
10 else fprintf(stderr,"Fork failed.\n");
11 fprintf(stderr,"Proccess end. pid=[%d]\n",getpid(),i);
这段代码只是创建了一个进程的,同时将进程的pid打印到屏幕。
(二) 两个进程
两个进程的创建和一个创建没啥区别,这里引出一下,多个进程执行会发现进程调度。代码如下:
2 int status;
3 if((pid1=fork())<0) exit(1);
4 else if (pid1==0) /* child Process 1*/
5 {
6 signal(SIGINT,childfunc1);
7 printf("I'm Child One!\n");
8 sleep(30);
9 exit(0);
10 }
11 if((pid2=fork())<0)exit(1);
12 else if(pid2==0) /*child Proccess 2*/
13 {
14 signal(SIGINT,childfunc2);
15 printf("I'm Child Two!\n");
16 sleep(30);
17 exit(0);
18 }
19
20 fprintf(stderr,"Fork child pid=[%d][%d]\n",pid1,pid2);
21 sleep(1);
22 getchar();
23 /*printf("I'm Father!\n");*/
24 kill(pid1,SIGINT);
25 wait(&status);
26 kill(pid2,SIGINT);
27 wait(&status);
28 fprintf(stderr,"Parent Process is Killed!\n");
这里有了新的内容,主要就是下章要讲的了。
(三)信号
信号可以十分方便的控制进程,尤其是杀死他的时候……关于信号的种类十分多,不能在这一一阐述。这里使用的SIGINT信号,用于捕获中断信号,十分简单一个信号,对ctrl+c和del键有效,其中signal的使用方法请查看相关书籍。这里简略说一下kill的使用,杀进程主要靠 的就是他啦,发送信号就是了,然后wait是未来等待kill执行结束的。
(四)管道
管道这节小实验要求十分少,就是写入管道然后读出再输出到屏幕就行了……也没有要求双向通信,双向通信就要建两个管道
这里主要就演示一下写入和读取就是了。毕竟只是简单的函数调用,两个子进程分别写入数据,然后主进程再读取输出。代码如下:
{
close(fildes[0]);
write(fildes[1],"Child 2 is sending a message!\n",strlen("Child 2 is sending a message!\n"));
return;
}
close(fildes[1]);
memset(buf,0,sizeof(buf));
j=read(fildes[0],buf,sizeof(buf));
fprintf(stderr,"Message:\n%s Length:%d\n",buf,j);
注意这里读取的方法,以及要清空缓存。
(五)总结
Unix下的编程一个词:简练,但是并不简单,这里所列出的仅限于实验有很大的局限性,连冰山一角都难算上。最后附上老师的附加实验的代码,不再讲解,签名能看懂的应该都差不多这个:
消息队列实验完全代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
希望您能从这里有所收获,本blog未经特殊说明均为原创,转载请注明出处,谢谢合作!
出处:http://pc-funning.cnblogs.com
希望您能从这里有所收获,本blog未经特殊说明随笔均为原创。随笔版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。