Unix编程小结(限于实验范围)

     实验很快搞定了,学到了不少东西,当时我知道Unix编程不是这么几个简单的实验,但是已经对我来说不是那么陌生,突然发现Unix下的编程是十分简洁高效的!当然也因为不用考虑图形界面的设计,摆脱了不少看似简单但是十分麻烦的问题。但是这次主要是用c编程,而且实验实在太小了,也没用上啥面向对象思想,纯属玩弄c语言技巧了。当然也验证了一句话:“当你对c的经验增加时,她会显得十分的好用。”

(一)创建进程

     fork()函数。使用简单明了,书上已经说了很多了。但是课本上的使用方法太没章法了,首先他定义pid用的是int,这是没什么问题,但是很不直观,不然用pid_t直观。其次,他对进程创建失败的处理可以说就没有,而且创建多个进程就多层嵌套了,很容易出错,这里也不贴这种不易维护的代码了,先看看我是如何练习这一项的。代码节选如下:

 

 1         fprintf(stderr,"Proccess Begin.pid=[%d],i=[%d]\n",getpid(),i);
 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打印到屏幕。

(二) 两个进程

     两个进程的创建和一个创建没啥区别,这里引出一下,多个进程执行会发现进程调度。代码如下:

     

 1         pid_t pid1,pid2;
 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执行结束的。

(四)管道

     管道这节小实验要求十分少,就是写入管道然后读出再输出到屏幕就行了……也没有要求双向通信,双向通信就要建两个管道

     这里主要就演示一下写入和读取就是了。毕竟只是简单的函数调用,两个子进程分别写入数据,然后主进程再读取输出。代码如下:     

                        else if(pid2==0/*child Proccess 2*/
            {
                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下的编程一个词:简练,但是并不简单,这里所列出的仅限于实验有很大的局限性,连冰山一角都难算上。最后附上老师的附加实验的代码,不再讲解,签名能看懂的应该都差不多这个:

消息队列实验完全代码:

 

Code

 

 

希望您能从这里有所收获,本blog未经特殊说明均为原创,转载请注明出处,谢谢合作!

 

 

posted @ 2008-11-24 20:04  魔尊年少时  阅读(406)  评论(1编辑  收藏  举报