c语言父子进程通信,父子进程间通信:1:共享内存2:信号量:父进程里请求信号量异常,高手帮忙...

当前位置:我的异常网» C语言 » 父子进程间通信:1:共享内存2:信号量:父进程里请

父子进程间通信:1:共享内存2:信号量:父进程里请求信号量异常,高手帮忙

www.myexceptions.net  网友分享于:2013-03-24  浏览:70次

父子进程间通信:1:共享内存2:信号量:父进程里请求信号量错误,高手帮忙

linux 环境下gcc

单步调试发现main函数里的ID和write函数里的ID 值不一样。

不知道问题出现在哪里。。请帮忙看下。

/*父子进程间通信:1>共享内存2>信号量*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

union semun//声明联合体供semctl使用

{

int val;//存放命令字SETVAL的值

struct semid_ds *buf;//存放IPC_STAT或从信号量里取的的值

unsigned short *array;

struct seminfo *_but;

};

#define SIZE 100

void request_sem(int id );

void release_sem();

void sem_delete();

void write_shm(int shmid, char *segptr, char *strin);

void read_shm(int shmid, char *segptr, char *strout);

void remove_shm(int shmid);

int semheld = 0;

int id = 0;

pid_t pid;

int ret;

int main(int argc, char *argv[])

{

int shmid;

char *segptr ;

union semun my_union;

char strin[100];

char strout[100];

id = semget(IPC_PRIVATE, 1, SHM_R|SHM_W);//创建信号量

if (id != -1)

{

atexit(&sem_delete);

my_union.val = 1;//初始化信号量

if (semctl(id, 0, SETVAL, my_union) == -1)

{

printf("semctl failed \n");

exit(-1);

}

}

else

printf("xinhaoliangchuangjianshibai");

if((shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT|0600)) == -1)//创建共享内存

{

perror("shmget");

exit(1);

}

if((segptr = (char *)shmat(shmid, NULL, 0)) == (void *)-1)//连接共享内存

printf("segptr error\n");

pid = fork();

if (pid == 0)//子进程负责往共享内存写数据

{

printf("In child process:\n");

request_sem(id);

printf("Please input some char\n");

scanf("%s", strin);

setbuf(stdin, NULL);

write_shm(shmid, segptr, strin);

release_sem(id);

exit(0);

}

if (pid != -1)//父进程负责往共享内存里读

{

sleep(5);

pid = wait(&ret);

printf("In child process:\n");

request_sem(id);

read_shm(shmid, segptr, strout);

printf("Read data from share memory is: %s", strout);

release_sem(id);

}

remove_shm(shmid);

sem_delete();

}

/*请求信号量*/

void request_sem(int id )

{

struct sembuf sb;

if (semheld >0)

{

printf("I have hold a semaphor\n");

return ;

}

sb.sem_num = 0;

sb.sem_op = -1;

sb.sem_flg = SEM_UNDO;

printf("Requesting semaphor\n");

setbuf(stdout, NULL);

if (semop(id, &sb, 1) == -1)

{

printf("semop error:%s", strerror(errno));

exit(-1);

}

semheld++;

printf("current process have hold this semaphor!\n");

}

/* 释放信号量*/

void release_sem(int id)

{

struct sembuf sb;

if (semheld <1)

{

printf("I don't have any semaphor\n");

return ;

}

sb.sem_num = 0;

sb.sem_op = 1;

sb.sem_flg = SEM_UNDO;

if (semop(id, &sb, 1) == -1)

{

printf("Semaphor release failed \n");

exit(-1);

}

semheld--;

printf("Sem release successfully\n");

}

/*删除信号量*/

void sem_delete()

{

if (semctl(id, IPC_RMID, 0) == -1)

{

printf("Del semaphor error!\n");

}

}

/*往共享内存写数据*/

void write_shm(int shmid, char *segptr, char *strin)

文章评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值