• IO和进程day08(消息队列、共享内存、信号灯集)


    今日任务

    1.代码 

    inversion.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. int main(int argc, const char *argv[])
    11. {
    12. //创建打开共享内存
    13. //1.生成key
    14. key_t key=ftok("./",1);
    15. if(-1==key){
    16. perror("key");
    17. return -1;
    18. }
    19. //2.获取id号
    20. int shmId=shmget(key,128,IPC_CREAT|0664);
    21. if(-1==shmId){
    22. perror("shmget");
    23. return -1;
    24. }
    25. //3.获取映射地址
    26. void* addr=shmat(shmId,NULL,0);
    27. if((void *)-1==addr){
    28. perror("shmat");
    29. return -1;
    30. }
    31. char *q=(char*)addr;
    32. //创建信号量集,共创建两灯:
    33. //0:初始值为1,负责打印,打印前0号灯-1;打印结束,1号灯+1;
    34. //1:初始值为0,负责逆置,逆置前1号灯-1;逆置结束,0号灯+1;
    35. int semId=semget(key,2,IPC_CREAT|0664);
    36. if(-1==semId){
    37. perror("semId");
    38. return -1;
    39. }
    40. struct sembuf sops={0,1,0};
    41. if(-1==semop(semId,&sops,1)){
    42. perror("semop");
    43. return -1;
    44. }
    45. puts("初始化完成");
    46. struct sembuf p={1,-1,0};//1号灯-1
    47. struct sembuf v={0,1,0};//0号灯+1
    48. while(1){
    49. //逆置
    50. if(-1==semop(semId,&p,1)){
    51. perror("semop p");
    52. return -1;
    53. }
    54. //操作
    55. for (int i=0; i<strlen(q)/2; i++)
    56. {
    57. char temp=*(q+i);
    58. *(q+i)=*(q+strlen(q)-1-i);
    59. *(q+strlen(q)-1-i)=temp;
    60. }
    61. if(-1==semop(semId,&v,1)){
    62. perror("semop p");
    63. return -1;
    64. }
    65. }
    66. return 0;
    67. }

    print.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. int main(int argc, const char *argv[])
    12. {
    13. //创建打开共享内存
    14. //1.生成key
    15. key_t key=ftok("./",1);
    16. if(-1==key){
    17. perror("key");
    18. return -1;
    19. }
    20. //2.获取id号
    21. int shmId=shmget(key,128,IPC_CREAT|0664);
    22. if(-1==shmId){
    23. perror("shmget");
    24. return -1;
    25. }
    26. //3.获取映射地址
    27. void* addr=shmat(shmId,NULL,0);
    28. if((void *)-1==addr){
    29. perror("shmat");
    30. return -1;
    31. }
    32. strcpy((char*)addr,"1234567");
    33. //创建信号量集,共创建两灯:
    34. //0:初始值为1,负责打印,打印前0号灯-1;打印结束,1号灯+1;
    35. //1:初始值为0,负责逆置,逆置前1号灯-1;逆置结束,0号灯+1;
    36. int semId=semget(key,2,IPC_CREAT|0664);
    37. if(-1==semId){
    38. perror("semId");
    39. return -1;
    40. }
    41. struct sembuf sops={0,1,0};
    42. if(-1==semop(semId,&sops,1)){
    43. perror("semop");
    44. return -1;
    45. }
    46. puts("初始化完成");
    47. struct sembuf p={0,-1,0};//0号灯-1
    48. struct sembuf v={1,1,0};//1号灯+1
    49. while(1){
    50. //打印,
    51. if(-1==semop(semId,&p,1)){
    52. perror("semop p");
    53. return -1;
    54. }
    55. //操作
    56. sleep(1);
    57. printf("%s\n",(char*)addr);
    58. if(-1==semop(semId,&v,1)){
    59. perror("semop p");
    60. return -1;
    61. }
    62. }
    63. return 0;
    64. }

    运行结果:

    今日思维导图

    明日即考,量多待复,汝甚忧之

  • 相关阅读:
    全解MySQL之各方位事无巨细的剖析存储过程与触发器!
    webpack打包常用配置项
    计算机毕业设计(附源码)python长途汽车订票系统
    Part3_理解MATSIM_第50章 运动波的排队表示
    【C++常见八股2】vector 的 push_back 扩容问题 | char *和 char [] 区别
    配合AI刷leetcode 实现1170
    申请全国400电话的步骤及注意事项
    各种测试方法,黑盒测试、白盒测试,静态测试,动态测试
    OpenCV之VideoCapture
    RNA 25. SCI文章中估计组织浸润免疫细胞和基质细胞群的群体丰度(MCP-counter)
  • 原文地址:https://blog.csdn.net/weixin_53762703/article/details/132889935