这篇发的很纠结,这不是我原创的代码,是同学写的,我只是想在这记录下来,以后没事可以看看,写转载嘛,又没有转载的来源,翻译就更扯了,勉强写个原创,其实不是我原创啦。 ( ̄▽ ̄)" 有兴趣可以看下,这是关于linux中的信号量的使用的一篇文章。我加了一些注释。

题目是:写一个程序,该程序创建两个进程,分别打印"this is the child process"和"father say hello to child",要求交替打印,输出成"this father is say the hello child to process child",每打印一个单词进程阻塞一段时间。将输出打印到当前目录下的tmp文件中。

答:

 
  
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <sys/types.h> 
  4. #include <sys/ipc.h> 
  5. #include <sys/sem.h> 
  6. #include <sys/stat.h> 
  7. #include <fcntl.h> 
  8.  
  9. union semun 
  10.     int val; 
  11.     struct semid_ds *buf; 
  12.     unsigned short int *array; 
  13.     struct seminfo *__buf; 
  14. }; 
  15.  
  16. int main(void
  17.     char* buf_child[]={"this""is""the""child""process"}; 
  18.     char* buf_father[]={"father""say""hello""to""child"}; 
  19.     int i = 0, semid, fd; 
  20.     pid_t pid; 
  21.     struct sembuf sb; //信号量操作
  22.     union semun sem; 
  23.     semid = semget(1000, 2, 0666 | IPC_CREAT); //申请信号量组,包含2个信号量
  24.  
  25.     sem.val = 0; 
  26.     semctl(semid, 0, SETVAL, sem); //初始化0号信号量为0
  27.     sem.val = 1; 
  28.     semctl(semid, 1, SETVAL, sem); //初始化1号信号量为1
  29.  
  30.     fd=open("tmp",O_CREAT|O_TRUNC|O_WRONLY,0666); 
  31.  
  32.     pid = fork(); 
  33.     switch (pid) { 
  34.         case -1: 
  35.             perror("fork fail"); 
  36.             break
  37.         case 0: /* child consume */ 
  38.             srand((unsigned int)getpid()); 
  39.             while (i < 5) { 
  40.                 sb.sem_num = 1; //将1号信号量
  41.                 sb.sem_op = -1; //减1
  42.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  43.                 semop(semid, &sb, 1); 
  44.  
  45.                 write(fd,buf_child[i], strlen(buf_child[i])); 
  46.                 sleep(rand()); 
  47.                 write(fd,&" ", 1); 
  48.                 i++; 
  49.  
  50.                 sb.sem_num = 0; //将0号信号量
  51.                 sb.sem_op = 1;  //加1
  52.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  53.                 semop(semid, &sb, 1); //操作信号量
  54.             } 
  55.             break
  56.         default:/* parent production  */ 
  57.             srand((unsigned int)getpid()); 
  58.             while (i < 5) { 
  59.                 sb.sem_num = 0; //将0号信号量
  60.                 sb.sem_op = -1; //减1
  61.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  62.                 semop(semid, &sb, 1); //操作信号量
  63.  
  64.                 write(fd,buf_father[i], strlen(buf_father[i])); 
  65.                 sleep(rand()); 
  66.                 write(fd,&" ", 1); 
  67.                 i++; 
  68.  
  69.                 sb.sem_num = 1; 
  70.                 sb.sem_op = 1; 
  71.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  72.                 semop(semid, &sb, 1); 
  73.             } 
  74.             break
  75.     } 
  76.     return 0;