小弟我无聊的时候写了一个自己跟自己说话的程序
我无聊的时候写了一个自己跟自己说话的程序
我原本的想法是同时打开两个终端,运行同一个程序,然后互相说话
用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是什么
------解决方案--------------------
我原本的想法是同时打开两个终端,运行同一个程序,然后互相说话
用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是什么
------解决方案--------------------