IO进程线程第九天(8.7)IPC机制 字符串逆置,实现两个进程对话

1.要求在共享空间存入字符串1234567,a进程循环打印,b进程倒置字符串,不允许出现乱序

#include
#include
int main(int argc, const char *argv[])
{
    key_t key=ftok("./",1);
    if(key<0)
    {
        ERR_MSG("ftok");
        return -1;
    }
    int shmid=shmget(key,20,IPC_CREAT|0664);
    if(shmid<0)
    {
        ERR_MSG("shmget");
        return -1;
    }
    void* addr = shmat(shmid,NULL,0);
    if((void *)-1==addr)
    {
        ERR_MSG("shmat");
        return -1;
    }
    char a[]="1234567";
    char *p=(char *)addr;
    strcpy(p,a);
    int *flag=((int *)((char *)addr+7));
    *flag=0;
    pid_t f=fork();
    if(f<0)
    {
        ERR_MSG("fork");
        return -1;
    }
    if(f>0)
    {
        while(1)
        {
            if(0==(*flag))
            {
                printf("%s\n",(char *)addr);
                *flag=1;
            }
        }                                                                                                                                                                                 
    }
    if(0==f)
    {
        char *q=(char *)addr;
        int len=strlen(a)-1;
        while(1)
        {
            if(1==(*flag))
            {
                for(int i=0;i

IO进程线程第九天(8.7)IPC机制 字符串逆置,实现两个进程对话_第1张图片

 使用消息队列实现AB进程对话,实现随时收发,输入quit实现停止对话

1

#include
#include
struct msgbuf
{
    long mtype;
    char mtext[128];
};
int main(int argc, const char *argv[])
{
    key_t key=ftok("./",1);
    if(key<0)
    {   
        ERR_MSG("ftok");
        return -1; 
    }   
    int msqid=msgget(key,IPC_CREAT|0664);
    if(msqid<0)
    {   
        ERR_MSG("msgget");
        return -1; 
    }   
    struct msgbuf a;
    pid_t fd=fork();
    if(fd<0)
    {   
        ERR_MSG("fork");
        return -1; 
    }   
    if(fd>0)
    {   
        while(1)
        {
            a.mtype=2;
            scanf("%s",a.mtext);
            if(msgsnd(msqid,&a,sizeof(a.mtext),0)<0)
            {
                ERR_MSG("msgsnd");
                return -1; 
            }
            if(0==strcmp(a.mtext,"quit"))
            {
                break;
            }
        }
    }   
    if(0==fd)
    {   
        ssize_t res;
        while(1)
        {
            res=msgrcv(msqid,&a,sizeof(a.mtext),1,0);
            if(res<0)
            {
                return -1; 
            }
            if(0==strcmp(a.mtext,"quit"))
            {
                break;
            }
            printf("%s\n",a.mtext);
        }                                                                                                                                               
            kill(getppid(),2);
    }   
    return 0;
} 

2.

#include
#include
struct msgbuf
{
    long mtype;
    char mtext[128];
};
int main(int argc, const char *argv[])
{
    key_t key=ftok("./",1);
    if(key<0)
    {   
        ERR_MSG("ftok");
        return -1; 
    }   
    int msqid=msgget(key,IPC_CREAT|0664);
    if(msqid<0)
    {   
        ERR_MSG("msgget");
        return -1; 
    }   
    struct msgbuf a;
    pid_t fd=fork();
    if(fd<0)
    {   
        ERR_MSG("fork");
        return -1; 
    }   
    if(fd>0)
    {   
        while(1)
        {
            a.mtype=1;
            scanf("%s",a.mtext);
            if(msgsnd(msqid,&a,sizeof(a.mtext),0)<0)
            {
                ERR_MSG("msgsnd");
                return -1; 
            }
            if(0==strcmp(a.mtext,"quit"))
            {
                break;
            }

        }
    }   
    if(0==fd)
    {   
        ssize_t res;
        while(1)
        {
            res=msgrcv(msqid,&a,sizeof(a.mtext),2,0);
            if(res<0)
            {
                ERR_MSG("msgrcv");
                return -1; 
            }                                                                                                                                           
            if(0==strcmp(a.mtext,"quit"))
            {
                break;
            }
            printf("%s\n",a.mtext);
        }
            kill(getppid(),2);
    }   
    return 0;
} 

IO进程线程第九天(8.7)IPC机制 字符串逆置,实现两个进程对话_第2张图片

 

你可能感兴趣的:(开发语言,算法,c语言,linux,IO)