该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
怎么将软中断与共享内存相结合?
现贴代码:
软中断:
#include
#include
#include
#include
int wait_mark;
void waiting( ) //自定义waiting 函数与 wait(0) 作用不同,作用是是通过循环使子进程停止。
{
while(wait_mark!=0);
}
void stop( ) //调用此函数时,使wait_mark=0,结束waiting 函数中的循环,使子进程继续执行
{
wait_mark=0;
}
int main()
{
int p1,p2;
while((p1=fork( ))==-1);
if(p1>0)
{
while((p2=fork( ))==-1);
if(p2>0) //在父进程中
{
printf("parent\n");
kill(p1,16); //发送信号16
kill(p2,17); //发送信号17
wait(0); //等待 p1、p2 中的某个子进程结束
wait(0); //等待 p1、p2 中的某个子进程结束
printf("parent process id killed! \n");
exit(0);
}
else /* p2==0*/
{
printf("p2\n");
wait_mark=1;
signal(17,stop); //将信号17和函数 stop 关联起来
waiting( ); //循环,知道父进程发送信号17时,调用stop后继续执行
printf("child p2 is killed by parent! \n");
exit(0);
}
}
else/*p1==0*/
{
printf("p1\n");
wait_mark=1;
signal(16,stop);
waiting( );
printf("child p1 is killed by parent! \n");
exit(0);
}
共享内存:
#include
#include
#include
#include
#define SHMKEY 75
int shmid,i;
int *addr;
void SERVER( );
void CLIENT( );
int main()
{
while((i=fork())==-1); //创建一个子进程执行 SERVER(),即一个子进程发送消息
if(!i)SERVER( );
while((i=fork())==-1); //创建另一个子进程执行CLIENT(),即一个子进程接收消息 if(!i) CLIENT( );
wait(0); /*父进程阻塞,直到子进程结束*/
wait(0);
}
void SERVER( ) //服务器端
{
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); //创建共享区,并先取得id
addr=shmat(shmid,0,0); //通过id获得起始地址(虚地址)
do
{
*addr=-1; //取走数据
while(*addr==-1); //停止,等待客户端发送数据
printf("(server)received ," );
printf("server *addr %d\n", *addr);
}
while(*addr);
shmctl(shmid,IPC_RMID,0); //删除共享区
exit(0);
}
void CLIENT( ) //客户端
{
int i;
shmid=shmget(SHMKEY,1024,0777); //打开共享区
addr=shmat(shmid,0,0); //指向第一个单元
for(i=5; i>=0; i--)
{
while(*addr!=-1); //服务端没有取走,反复等待。
printf("(client)sent, ");
*addr=i; //实现同步
printf("client i: %d\n",i);
}
exit(0);
}
求大佬们指教!!!