实验三:Linux进程管理(HDU)

2.设计内容

把下面的几个网址的内容看懂,关于Linux的通信机制就会有个基本的了解了,后面的这几个代码也应该可以看得懂了。

2)实现一个管道通信程序。话不多说,直接贴代码。

#include <sys/sem.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <time.h>
#include <sys/wait.h>
#define BUFFER_SIZE 8192

int pipe_used_size(int pipe[2],sem_t *pipe_mutex){
	int status=0;
	int count=0;
	char buffer[1];
	sem_wait(pipe_mutex);
	while(status>=0){
		status=read(pipe[0], buffer,1);
		if(status>=0){count=count+1;}	
	}
	for(int i=0;i<count;i++){
		write(pipe[1],buffer,1);
	}
	sem_post(pipe_mutex);
	printf("pipe has %dB used
",count);
	return count;
}

int pipe_left_size(int pipe[2],sem_t *pipe_mutex){
	int status=0;
	int count=0;
	char buffer[1];
	sem_wait(pipe_mutex);
	while(status>=0){
		status=write(pipe[1],buffer,1);
		if(status>=0){count=count+1;}	
	}
	for(int i=0;i<count;i++){
		read(pipe[0], buffer,1);
	}
	sem_post(pipe_mutex);
	printf("pipe has %dB left
",count);
	return count;
}

int main(){
	int pipe_fd[2];
	int status;
	char buffer[BUFFER_SIZE];//会初始化为0吗?
	pid_t pid1,pid2,pid3;
	sem_t *pipe_mutex;
	pipe_mutex = sem_open("pipe_mutex", O_CREAT | O_RDWR, 0666, 0);
	int pipe_size = 0;
	status = pipe(pipe_fd);
	if(status == -1){
		printf("create pipe failed");
		exit(-1);
	}

	int flags = fcntl(pipe_fd[1], F_GETFL);
        fcntl(pipe_fd[1], F_SETFL, flags | O_NONBLOCK);
	flags = fcntl(pipe_fd[0], F_GETFL);
        fcntl(pipe_fd[0], F_SETFL, flags | O_NONBLOCK);
        //这一块是干什么的?就是为了实现非阻塞写,
        //因为在无名管道中没有open(),但是可以通过这个中方式来设置实现非阻塞写

	while(status>=0){
		status = write(pipe_fd[1], buffer, 128);//怎么那个管道的最大是多大?为啥出来是653....,这个是查看默认的管道的空间大小是多少。
		if(status>=1){
		pipe_size += 128;
		}
	}

	printf("pipe size:%d
", pipe_size);
	//pipe_used_size(pipe_fd,pipe_mutex);
	status=0;
	
	while(status>=0){
		status = read(pipe_fd[0], buffer, 128);
	}
	
	printf("EAGAIN %d
", EAGAIN);
	
	/*flags = fcntl(pipe_fd[1], F_GETFL);
        fcntl(pipe_fd[1], F_SETFL, flags ^ O_NONBLOCK);
	flags = fcntl(pipe_fd[0], F_GETFL);
        fcntl(pipe_fd[0], F_SETFL, flags ^ O_NONBLOCK);*/

	status = 0;
	if((pid1 = fork()) == 0){
		while(status>=0){
			sem_wait(pipe_mutex);
			printf("child1 start writing
");
			status=write(pipe_fd[1], buffer, 128);
			printf("child1 write %d
", status);
			//sleep(1);
			sem_post(pipe_mutex);
		}
		exit(0);
	}else if((pid2 = fork()) == 0){
		while(status>=0){
			sem_wait(pipe_mutex);
			printf("child2 start writing
");
			status=write(pipe_fd[1], buffer, 2047);
			printf("child2 write %d
", status);
			//sleep(1);
			sem_post(pipe_mutex);
		}
		exit(0);
	}else if((pid3 = fork()) == 0){
		while(status>=0){
			sem_wait(pipe_mutex);
			printf("child3 start writing
");
			status=write(pipe_fd[1], buffer, 4200);
			printf("child3 write %d
", status);
			//sleep(1);
			sem_post(pipe_mutex);
		}
		exit(0);
	}else{
		getchar();//这个语句在这里的作用是什么?
		sem_post(pipe_mutex);
		wait(0);
		wait(0);
		wait(0);
		pipe_left_size(pipe_fd,pipe_mutex);//这两个函数的作用又是什么?
		sem_unlink("pipe_mutex");
	}	
	
	
	return 0;
}

3)利用Linux的消息队列通信机制实现线程的通信,也是直接上代码。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/sem.h>
#include<sys/shm.h>
#include <fcntl.h>
#define MSG_MAX 100

struct my_msgbuf{
      long int mtype;
      char mtext[MSG_MAX];
};


void *sender1(){
       int n;
       struct my_msgbuf message;
       char buf[MSG_MAX];
       sem_t *mutex = sem_open("mutex", O_CREAT | O_RDWR, 0666, 0);
       sem_t *sender1_over = sem_open("sender1_over", O_CREAT | O_RDWR, 0666, 0);
       sem_t *receive1_over = sem_open("receive1_over", O_CREAT | O_RDWR, 0666, 0);
       int msqid = msgget((key_t)8088, 0666 | IPC_CREAT);
       if( msqid == -1){
             printf("create failed");
             exit(-1);
       }

       while(1){
             sem_wait(mutex);
             printf("sender1 wirte :");
             scanf("%s", &buf);
             printf("
");
             message.mtype = 1;
             if(strcmp(buf,"exit") == 0){
                     strcpy(message.mtext,"end1");
                     n = msgsnd(msqid, (void *)&message, 100, 0);//还有关于这个接收消息的类型?
                     sem_wait(receive1_over);
                     n = msgrcv(msqid, (void *)&message, 100, 2, 0);
                     printf("%s
", message.mtext);

                     sem_post(sender1_over);
                     sem_post(mutex);
                     sleep(1);
                     return 0;
             }
             else{
                     strcpy(message.mtext,buf);
                     n = msgsnd(msqid, (void *)&message, 100, 0);
                     sem_post(mutex);
                     sleep(1);
             }

       }

}


void *sender2(){
       int n;
       struct my_msgbuf message;
       char buf[MSG_MAX];
       sem_t *mutex = sem_open("mutex", O_CREAT | O_RDWR, 0666, 0);
       sem_t *sender2_over = sem_open("sender2_over", O_CREAT | O_RDWR, 0666, 0);
       sem_t *receive2_over = sem_open("receive2_over", O_CREAT | O_RDWR, 0666, 0);
       int msqid = msgget((key_t)8088, 0666 | IPC_CREAT);
       if( msqid == -1){
             printf("create failed");
             exit(-1);
       }

       while(1){
             sem_wait(mutex);
             printf("sender2 wirte :");
             scanf("%s", &buf);
             printf("
");
             message.mtype = 1;
             if(strcmp(buf,"exit") == 0){
                     strcpy(message.mtext,"end2");
                     n = msgsnd(msqid, (void *)&message, 100, 0);
                     sem_wait(receive2_over);
                     n = msgrcv(msqid, (void *)&message, 100, 3, 0);
                     printf("%s
", message.mtext);
                     sem_post(sender2_over);
                     sem_post(mutex);
                     sleep(1);
                     return 0;
             }
             else{
                     strcpy(message.mtext,buf);
                     n = msgsnd(msqid, (void *)&message, 100, 0);
                     sem_post(mutex);
                   sleep(1);
             }
       }

}


void *receive(){
           int n;
           int over1=0;
           int over2=0;
           struct my_msgbuf message;
           char buf[MSG_MAX];
           sem_t *sender1_over = sem_open("sender1_over", O_CREAT | O_RDWR, 0666, 0);
           sem_t *receive1_over = sem_open("receive1_over", O_CREAT | O_RDWR, 0666, 0);
           sem_t *sender2_over = sem_open("sender2_over", O_CREAT | O_RDWR, 0644, 0);
           sem_t *receive2_over = sem_open("receive2_over", O_CREAT | O_RDWR, 0666, 0);
           int msqid = msgget((key_t)8088, 0666 | IPC_CREAT);

           if( msqid == -1){
               printf("create failed");
               exit(-1);
           }

           while(1){
                   n = msgrcv(msqid, (void *)&message, 100, 0, 0);
                   if(n > 0){
                         printf("
 receive %s
", message.mtext);
                         if( strcmp(message.mtext,"end1") == 0 ){
                               message.mtype = 2;
                               strcpy(message.mtext,"over1");
                               n = msgsnd(msqid, (void *)&message, 100, 0);
                               if( n == 0 ){
                                   sem_post(receive1_over);

                                   sem_wait(sender1_over);

                               }
                               over1 = 1;
                         }else if( strcmp(message.mtext,"end2") == 0 ){
                               message.mtype = 3;
                               strcpy(message.mtext,"over2");
                               n = msgsnd(msqid, (void *)&message, 100, 0);
                               if( n == 0 ){
                                   sem_post(receive2_over);
                                   sem_wait(sender2_over);
                               }
                               over2 = 1;
                         }

                   }
                   if(over1==1 && over2==1){
                       msgctl(msqid, IPC_RMID, 0);
                       exit(0);
                   }
                   sleep(1);
           }

}





int main(){
           int msqid = msgget((key_t)8088, 0666 | IPC_CREAT);
           msgctl(msqid, IPC_RMID, 0);
           sem_unlink("mutex");
           sem_unlink("sender1_over");
           sem_unlink("sender2_over");
           sem_unlink("receive1_over");
           sem_unlink("receive2_over");

           sem_t *mutex = sem_open("mutex", O_CREAT | O_RDWR, 0666, 0);
           sem_t *sender1_over = sem_open("sender1_over", O_CREAT | O_RDWR, 0666, 0);
           sem_t *receive1_over = sem_open("receive1_over", O_CREAT | O_RDWR, 0666, 0);
           sem_t *sender2_over = sem_open("sender2_over", O_CREAT | O_RDWR, 0666, 0);
           sem_t *receive2_over = sem_open("receive2_over", O_CREAT | O_RDWR, 0666, 0);

           pthread_t pt1,pt2,pt3;
           pthread_create(&pt1, NULL, sender1, NULL);
           pthread_create(&pt2, NULL, sender2, NULL);
           pthread_create(&pt3, NULL, receive, NULL);
           sem_post(mutex);
           pthread_join(pt1, NULL);
           pthread_join(pt2, NULL);
           pthread_join(pt3, NULL);
           return 0;
}

4)利用Linux的共享内存通信机制实现两个进程间的通信。

//为消息接收程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include <fcntl.h>

int main(){

         char buf[50];
         int shmid = shmget((key_t)8888, 50, IPC_CREAT | 0666);
         sem_t *mutex1 = sem_open("mutex1", O_CREAT | O_RDWR, 0666, 0);
         sem_t *mutex2 = sem_open("mutex2", O_CREAT | O_RDWR, 0666, 0);

         sem_wait(mutex1);

         char *m =(char *)shmat(shmid, NULL, 0);
         printf("receive: %s 
",m);
         strcpy(buf, "over");
         memcpy(m,buf,sizeof(buf));

         shmdt(shmid);
         sem_post(mutex2);

         return 0;

}
//为消息发送程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include <fcntl.h>

int main(){
        char buf[50];

        int shmid = shmget((key_t)8888, 50, IPC_CREAT | 0666);
        shmctl((key_t)8888, IPC_RMID, NULL);
        sem_unlink("mutex1");
        sem_unlink("mutex2");

        sem_t *mutex1 = sem_open("mutex1", O_CREAT | O_RDWR, 0666, 0);
        sem_t *mutex2 = sem_open("mutex2", O_CREAT | O_RDWR, 0666, 0);
        shmid = shmget((key_t)8888, 50, IPC_CREAT | 0666);

        if( shmid == -1){
            printf("create failed");
            exit(-1);
        }

        char *m = (char *)shmat(shmid, NULL, 0);
        printf("sender writing:");
        scanf("%s", buf);
        memcpy(m,buf,sizeof(buf));
        sem_post(mutex1);
        sem_wait(mutex2);

        printf("
%s
/", m);

        shmdt(shmid);
        shmctl((key_t)8888, IPC_RMID, NULL);
        sem_unlink("mutex1");
        sem_unlink("mutex2");

        return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/tsruixi/p/10933112.html