小弟我无聊的时候写了一个自己跟自己说话的程序

我无聊的时候写了一个自己跟自己说话的程序
我原本的想法是同时打开两个终端,运行同一个程序,然后互相说话
用IPC实现的,编译也通过了
可是P操作总是返回0,不返回-1
代码:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>


union semun {
  int val;
  struct semid_ds *buf;
  unsigned short *array;
  struct seminfo *__buf;
};

int P(int semid)
{
  struct sembuf sops = {0,-1,IPC_NOWAIT};
  int t = semop(semid,&sops,1);
  return t;
}

int V(int semid)
{
  struct sembuf sops = {0,1,SEM_UNDO};
  return (semop(semid,&sops,1));
}

#define length 1024
int main()
{
  int shmkey= ftok("./share",1);
  int semkey= ftok("./shmem",1);
  int shmid,semid;
  int wait = 0;
  char *shmptr;
  //生成共享内存和信号量 
  if((shmid = shmget(shmkey,length,IPC_CREAT))==-1)
    {
      perror("shmget error \n");
      exit(1);
    }
  semid = semget(semkey,1,IPC_CREAT);
  if(semid==-1)
    {
      semid = semget(semkey,1,IPC_EXCL);
      if(semid ==-1)
{
  perror("semget error \n");
  exit(1);
}
    }
   //信号量置1 
  union semun arg;
  arg.val = 1;
  if((int)(shmptr=(char*)(shmat(shmid,NULL,0)))==-1)
    {
      perror("shmat error \n");
      exit(1);
    }

   if(semctl(semid,0,SETVAL,arg)==-1)
    {
      perror("semctl error \n");
      semctl(semid,0,IPC_RMID,arg);
      exit(1);
      }
    //开始聊天 
  while(1)
    {
      while( (P(semid) == -1)||(semctl(semid,0,GETZCNT,arg)>0))//gdb检查是出问题的地方,每次都不会进入这个循环
  {
    printf("waiting for enter...");
        wait = 1;
    sleep(1);
   }
      if( wait==1 )
  {
   printf(":%s\n",shmptr);
   }
      printf("say something:");
      scanf("%s",shmptr);
      while( V(semid) == -1)
  {
   printf("wait transferring \n");
   sleep(3);
   }
    }
  return 0;
}

------解决方案--------------------
(semctl(semid,0,GETZCNT,arg)>0)
看看errno是什么
------解决方案--------------------