进程通信(ipc)

来源:互联网 发布:购买域名的网站 编辑:程序博客网 时间:2024/05/20 23:04
进程创建一次返回了俩次,父进程返回子进程id,子进程成功返回0

1.管道 pipe

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <fcntl.h>
#include<string.h>
#include<errno.h>

extern int errno;

int main()
{
    if(access("write_fifo", F_OK) == -1)
    {
        int res = mkfifo("write_fifo", 0666);
        if(res == -1)
        {
            printf("errno = %d\n",errno);
            perror("mkfifo");
            exit(1);
        }
    }

    //printf("1111111111111111111\n");
    int write_fd = open("write_fifo", O_WRONLY);
    if(write_fd == -1)
    {
        perror("open write_fifo");
        //unlink("write_fifo");
        exit(1);
    }
    //printf("222222222222222222\n");

    int read_fd = open("read_fifo",O_RDONLY);
    if(read_fd == -1)
    {
        perror("open read_fifo");
        exit(1);
    }

    char sendbuf[256];
    char recvbuf[256];
    while(1)
    {
        printf("Ser:>");
        scanf("%s",sendbuf);
        if(strcmp(sendbuf, "quit") == 0)
        {
            close(write_fd);
            unlink("write_fifo");
            break;
        }
        write(write_fd, sendbuf, strlen(sendbuf)+1);

        read(read_fd, recvbuf, 256);
        printf("Cli:>%s\n",recvbuf);
    }

    return 0;
}

2.信号量(P,V操作)三个系统调用函数:semget(),semop(),semctl()

#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdlib.h>

union semun
{
    int              val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer (Linux-specific) */
};

int main()
{
    key_t sem_key;
    sem_key = ftok("mysem", 0xff);
    if(sem_key == -1)
    {
        perror("ftok");
        exit(1);
    }
    else
    {
        printf("sem_key = 0x%x\n",sem_key);
    }

    //create  //get
    int sem_id = semget(sem_key, 2, IPC_CREAT | IPC_EXCL | 0755);
    if(sem_id == -1)       
    {
        perror("semget");
        exit(1);
    }
    else
    {
        printf("sem_id = %d\n",sem_id);
    }

    union semun init_val, init_val1;
    init_val.val = 2;
    init_val1.val = 3;

    semctl(sem_id, 0, SETVAL, init_val);
    semctl(sem_id, 1, SETVAL, init_val1);

    struct sembuf  op[2];
    op[0].sem_num = 0;
    op[0].sem_op = -1;   //>0  ==0  <0
    op[0].sem_flg = 0;   //SEM_UNDO

    op[1].sem_num = 1;
    op[1].sem_op = -2;
    op[1].sem_flg = 0;

    semop(sem_id, op, 2);
    
    int sem_val = semctl(sem_id, 0, GETVAL);
    printf("sem_val = %d\n",sem_val);
    sem_val = semctl(sem_id, 1, GETVAL);
    printf ("sem_val1 = %d\n",sem_val);



    return 0;
}

3.共享内存:sham()

shamget();创建一段新的共享内存;

shmat()和shmdt():shmat链接共享之内存,shmdt()断开链接;

shmctl():;控制共享内存的某些属性;


#include"utili.h"


int main()
{
    key_t shm_key = ftok("myshm", 0xff);
    if(shm_key == -1)
    {
        perror("ftok shm_key");
        exit(1);
    }

    int shm_id = shmget(shm_key, 1024, IPC_CREAT|0755);
    if(shm_id == -1)
    {
        perror("shmget");
        exit(1);
    }

    void *shm_addr = shmat(shm_id, NULL, 0);
    if(shm_addr == (void *) -1)
    {
        perror("shmat");
        shmctl(shm_id, IPC_RMID, NULL);
        exit(1);
    }

    /////////////////////////////////////////////////////////
    key_t sem_key = ftok("myshm",0xfe);
    int sem_id = semget(sem_key, 2, IPC_CREAT|IPC_EXCL|0755);

    union semun init_val;
    init_val.val = 0;
    semctl(sem_id, 0, SETVAL, init_val);
    semctl(sem_id, 1, SETVAL, init_val);

    struct sembuf p = {1,-1, 0},
                  v = {0, 1, 0};

    while(1)
    {
        printf("Ser:>");
        scanf("%s",(char*)shm_addr);
        if(strcmp((char*)shm_addr, "quit") == 0)
        {
            shmdt(shm_addr);
            shmctl(shm_id, IPC_RMID, NULL);
            break;
        }
        semop(sem_id, &v, 1);

        semop(sem_id, &p, 1);
        printf("Cli:>%s\n",(char*)shm_addr);
    }

    return 0;
}

5.消息队列 ::msg();

msgget()::创建一个消息队列;

msgsnd()::添加一条消息到消息队列中;

msgctl()::控制属性;



#include"../utili.h"

#define SEND_TYPE  100
#define RECV_TYPE  200

typedef struct MsgType
{
    long msg_type;
    char msg_buf[256];
}MsgType;

int main()
{
    key_t msg_key;
    msg_key = ftok("mymsg",0xff);
    if(msg_key == -1)
    {
        perror("ftok");
        exit(1);
    }

    int msg_id = msgget(msg_key, IPC_CREAT|0755);
    if(msg_id == -1)
    {
        perror("msgget");
        exit(1);
    }

    MsgType msg;
    while(1)
    {
        printf("Ser:>");
        scanf("%s",msg.msg_buf);
        msg.msg_type = SEND_TYPE;
        msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);

        msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);
        printf("Cli:>%s\n",msg.msg_buf);
    }

    return 0;
}





























原创粉丝点击