大佬教程收集整理的这篇文章主要介绍了Linux程序设计:进程通信,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#define TEXT_SZ 2048 struct shared_use_st ????int written_by_you; ????char some_text[TEXT_SZ]; }; typedef struct shared_use_st shared_use_st; |
@H_450_18@ ?
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <String.h> #include <sys/shm.h> #include "shm_com.h" ? int main() ????int running = 1; ????void *shm_ptr = NULL; ????struct shared_use_st *shared_stuff; ????int shmid; ? ????srand((unsigned int)getpid()); ? ????shmid = shmget((key_t)1234,sizeof(shared_use_st),0666 | IPC_CREAT); ????printf("shmid = %x\n",shmid); ????if (shmid == -1) ????{ ????????fprintf(stderr,"shmget fail\n"); ????????exit(EXIT_FAILURE); ????} ????shm_ptr = shmat(shmid,NULL,0); ????//该值应该是shm在当前进程空间中的虚拟地址,而不是shm真实的物理地址@H_673_322@ ????//所以shm1和shm2的返回值不一样@H_673_322@ ? ????if (shm_ptr == (void *)-1) ????{ ????????fprintf(stderr,"shmat Failed\n"); ????????exit(EXIT_FAILURE); ????} ? ????printf("Memory attached at %p\n",shm_ptr); ? ????shared_stuff = (struct shared_use_st *)shm_ptr; ????shared_stuff->written_by_you = 0; ????while (running) ????{ ????????if (shared_stuff->written_by_you) ????????{ ????????????printf("you wrote %s\n",shared_stuff->some_text); ????????????sleep(5); ????????????shared_stuff->written_by_you = 0; ????????????if (strncmp(shared_stuff->some_text,"end",3) == 0) ????????????{ ????????????????running = 0; ????????????} ????????} ????} ? ????if(shmdt(shm_ptr) == -1) ????{ ????????fprintf(stderr,"shmdt Failed\n"); ????????exit(EXIT_FAILURE); ????} ? ????if(shmctl(shmid,IPC_RMID,NULL) == -1) ????{ ????????fprintf(stderr,"shmctl(IPC_RMID) Failed\n"); ????????exit(EXIT_FAILURE); ????} } |
?
? #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <String.h> #include <sys/shm.h> #include "shm_com.h" ? int main() ????int running = 1; ????void *shm_ptr = NULL; ????struct shared_use_st *share_stuff; ????char buff[TEXT_SZ]; ????int shmid; ? ????shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT); ????printf("shmid = %x\n",shmid); ????if(shmid == -1) ????{ ????????fprintf(stderr,"shmget Failed\n"); ????????exit(EXIT_FAILURE); ????} ? ????shm_ptr = shmat(shmid,0); ????if(shm_ptr == (void *)-1) ????{ ????????fprintf(stderr,"shmat Failed\n"); ????????exit(EXIT_FAILURE); ????} ????printf("Memory attached at %p\n",shm_ptr); ? ????share_stuff = (struct shared_use_st*)shm_ptr; ? ????while(running) ????{ ????????if(share_stuff->written_by_you == 1) ????????{ ????????????sleep(1); ????????????printf("waiTing for client\n"); ????????} ????????printf("Enter texts:"); ????????fgets(buff,TEXT_SZ,stdin); ????????strncpy(share_stuff->some_text,buff,TEXT_Sz); ????????share_stuff->written_by_you = 1; ???????? ? ????????if(strncmp(share_stuff->some_text,3) == 0) ????????{ ????????????running = 0; ????????} ????} ? ????if(shmdt(shm_ptr) == -1) ????{ ????????fprintf(stderr,"shmdt Failed\n"); ????????exit(EXIT_FAILURE); ????} ? } |
? #include <stdlib.h> #include <stdio.h> #include <String.h> #include <errno.h> #include <unistd.h> ? #include <sys/msg.h> struct msg_t ????long int msg_type; ????char content[BUFSIZ]; }; ? int main() ????int running = 1; ????int msgid; ????long int msg_to_receive = 0; //决定队列消息优先级,0表示获取队列第一个可用消息@H_673_322@ ????struct msg_t msg; ? ????msgid = msgget((key_t)1234,0666 | IPC_CREAT); ????printf("msgid = %d\n",msgid); ????if (msgid == -1) ????{ ????????fprintf(stderr,"msgget Failed\n"); ????????exit(EXIT_FAILURE); ????} ? ????while (running) ????{ ????????if (msgrcv(msgid,(void *)&msg,BUFSIZ,msg_to_receive,0) == -1) ????????{ ????????????fprintf(stderr,"msgrcv failde\n"); ????????????exit(EXIT_FAILURE); ????????} ????????printf("you wrote %s",msg.content); ????????if(strncmp(msg.content,3) == 0) ????????????running = 0; ????} ????if (msgctl(msgid,0) == -1) ????{ ????????fprintf(stderr,"msgcntl Failed\n"); ????????exit(EXIT_FAILURE); ????} ? } ? |
?
? #include <stdlib.h> #include <stdio.h> #include <String.h> #include <errno.h> #include <unistd.h> #include <sys/msg.h> #define MAX_TEXT 512 struct msg_t ????long int msg_type; ????char content[BUFSIZ]; }; ? int main() ????int running = 1; ????struct msg_t msg; ????int msgid; ????char buffer[BUFSIZ]; ? ????msgid = msgget((key_t)1234,msgid); @H_450_18@
? ????if (msgid == -1) ????{ ????????fprintf(stderr,"msgget Failed\n"); ????????exit(EXIT_FAILURE); ????} ? ????while (running) ????{ ????????printf("Enter texts:"); ????????msg.msg_type = 1; ????????strcpy(msg.content,buffer); ? ????????if(msgsnd(msgid,"msgsnd Failed\n"); @H_450_18@
????????????exit(EXIT_FAILURE); ????????} ????????if(strncmp(msg.content,3) == 0) ????????{ ????????????running = 0; ????????} ????} ? } |
?
@H_450_18@ ?
#if Defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) ????/* union semun is defined by including <sys/sem.h> */ #else ????/* according to X/OPEN we have to define it ourselves */ ????union semun { ????????int val; /* value for SETVAL */ ????????struct semid_ds *buf; /* buffer for IPC_STAT,IPC_SET */ ????????unsigned short int *array; /* array for getALL,SETALL */ ????????struct seminfo *__buf; /* buffer for IPC_INFO */ ????}; #endif ? |
?
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/sem.h> #include "semun.h" ? static int sem_id; static int set_semvalue() ????union semun sem_union; ????sem_union.val = 1; ????if (semctl(sem_id,0,SETVAL,sem_union) == -1) ????????return 0; ????return 1; } static void del_semvalue() ????union semun sem_union; ????if (semctl(sem_id,sem_union) == -1) ????????fprintf(stderr,"Fail to delete semaphore\n"); } static int sema_p() ????struct sembuf sem_b; ????sem_b.sem_num = 0;//信号量编号,除非是一组信号量,否则0 ????sem_b.sem_op = -1;//-1操作 ????sem_b.sem_flg = SEM_UNDO;//与操作系统对信号量的操作相关,一般是UNDO ????if (semop(sem_id,&sem_b,1) == -1) ????{ ????????fprintf(stderr,"sema_p Failed\n"); ????????return 0; ????} ????return 1; } static int sema_v() ????struct sembuf sem_b; ????sem_b.sem_num = 0; ????sem_b.sem_op = 1; ????sem_b.sem_flg = SEM_UNDO; ????if (semop(sem_id,"sema_v Failed\n"); @H_450_18@
????????return 0; ????} ????return 1; } ? int main(int argc,char *argv[]) ????int i; ????int pause_time; ????char op_char = ‘O‘; ????srand((unsigned int)getpid()); ????sem_id = semget((key_t)1234,1,0666 | IPC_CREAT); ????if (argc > 1) ????{ ????????if(set_semvalue() == 0) ????????{ ????????????fprintf(stderr,"init fail\n"); ????????????exit(EXIT_FAILURE); ????????} ????????op_char = ‘X‘; ????????sleep(2); ????} ? ????for (i = 0; i < 10; i++) ????{ ????????if (sema_p() == 0) ????????????exit(EXIT_FAILURE); ????????printf("%c",op_char); ????????fflush(stdout); ? ????????pause_time = rand() % 3; ????????sleep(pause_timE); ????????printf("%c",op_char); ????????fflush(stdout); ? ????????if (!sema_v()) ????????????exit(EXIT_FAILURE); ????????pause_time = rand() % 2; ????????sleep(pause_timE); ????} ????printf("\n%d - finished\n",getpid()); ????if (argc > 1) ????{ ????????sleep(10); ????????del_semvalue(); ????} } |
以上是大佬教程为你收集整理的Linux程序设计:进程通信全部内容,希望文章能够帮你解决Linux程序设计:进程通信所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。