Linux IPC

  • Pipe
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv)
{
    int pfd[2];
    pid_t cpd;
    char buf;
    
    if(argc != 2)
    {
        fprintf(stderr, "need argv\n");
        exit(EXIT_FAILURE);
    }

    if(pipe(pfd) == -1)
    {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    cpd = fork();

    if(cpd == -1) 
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(cpd == 0)
    {
        close(pfd[1]);
        while(read(pfd[0], &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);
        close(pfd[0]);
        exit(EXIT_SUCCESS);
    }
    else
    {
        close(pfd[0]);
        write(pfd[1], argv[1], strlen(argv[1]));
        close(pfd[1]);
        wait(NULL);
        exit(EXIT_SUCCESS);
    }
    
}
  • Named Pipe
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>

int main(int argc, char** argv)
{
    pid_t cpd;
    
    if(argc != 2)
    {
        fprintf(stderr, "need argv\n");
        exit(EXIT_FAILURE);
    }

    if(access("my_fifo", F_OK) == 0)
        unlink("my_fifo");
    
    if(mkfifo("my_fifo", 0777) == -1)
    {
        perror("mkfifo");
        exit(EXIT_FAILURE);
    }

    cpd = fork();

    if(cpd == -1)
    {   
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(cpd == 0)
    {
        int fd;
        char buf;
        fd = open("my_fifo", O_RDONLY);
        while(read(fd, &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);
        close(fd);
        exit(EXIT_SUCCESS);
    }
    else
    {
        int fd;
        fd = open("my_fifo", O_WRONLY);
        write(fd, argv[1], strlen(argv[1]));
        close(fd);
        wait(NULL);
        exit(EXIT_SUCCESS);
    }
}
  • Signal
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void sig_act(int sig)
{
    printf("thread%d got signal%d\n", pthread_self(), sig);
    sleep(5);
    printf("thread%d quit\n", pthread_self());
}

int main(int argc, char** argv)
{
    struct sigaction act;
    struct sigaction old_act;

    act.sa_handler = sig_act;
    sigaddset(&act.sa_mask, SIGQUIT);
    act.sa_flags = SA_NODEFER | SA_RESETHAND;
    
    sigaction(SIGINT, &act, &old_act);
    
    printf("main thread%d\n", pthread_self());
    for(;;) sleep(1);
    
    return 0;
}
  • Semaphore
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <string.h>

char *cache;
sem_t sem;

void *thread_function(void *arg)
{
    sem_wait(&sem);

    while(strncmp("#", cache, 1) != 0)
    {
        printf("%s from thread%d\n", cache, pthread_self());
        sem_wait(&sem);
    }

    pthread_exit(NULL);

}

int main(int argc, char** argv)
{
    pthread_t pth;
    void *pthret;
    
    cache = (char*)calloc(1, 1024); 

    if(sem_init(&sem, 0, 0) != 0)
    {
        perror("sem_init");
        exit(EXIT_FAILURE);
    }
    
    if(pthread_create(&pth, NULL, thread_function, NULL) != 0)
    {
        perror("pthread_create");
        exit(EXIT_FAILURE);
    }

    while(strncmp("#", cache, 1) != 0)
    {
        fgets(cache, 1024, stdin);
        sem_post(&sem);
    }

    if(pthread_join(pth, &pthret) != 0)
    {
        perror("pthread_join");
        exit(EXIT_FAILURE);
    }

    free(cache);
    sem_destroy(&sem);
    return 0;

}
  • Message Queue
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>

int main(int argc, char** argv)
{
    pid_t cpd;
    struct mq_attr attr;
    mqd_t mqd;
    char* messages[3];

    attr.mq_maxmsg = 8;
    attr.mq_msgsize = 1024;

    messages[0] = "message1";
    messages[1] = "message2";
    messages[2] = "message3";

    mqd = mq_open("/mymq", 
        O_RDWR | O_CREAT, 0777, &attr);

    if(mqd == -1)
    {
        perror("mq_open");
        exit(EXIT_FAILURE);
    }

    cpd = fork();

    if(cpd == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(cpd == 0)
    {
        sleep(3);
        
        char *msg;
        size_t msg_len;
        int pro;
        struct timespec t;
        
        t.tv_sec = 2;
        t.tv_nsec = 0;
        msg_len = attr.mq_msgsize;      
        msg = (char*)calloc(1, msg_len);
        pro = 0;

        while(mq_timedreceive(mqd, msg, msg_len, &pro, &t) > 0)
            printf("message is %s, priority is %d\n", msg, pro);
        printf("no more message\n");

        free(msg);
        mq_close(mqd);
        exit(EXIT_SUCCESS);
    }
    else
    {
        mq_send(mqd, messages[0], strlen(messages[0]), 1);
        mq_send(mqd, messages[1], strlen(messages[1]), 2);
        mq_send(mqd, messages[2], strlen(messages[2]), 3);
        
        mq_close(mqd);

        wait(NULL);
        mq_unlink("/mymq");
        exit(EXIT_SUCCESS);
    }

    return 0;

}
  • Memory Share
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/shm.h>

int main(int argc, char** argv)
{
    int shmid;
    char* shmaddr;
    pid_t pid;

    shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0600);
    
    if(shmid < 0)
    {
        perror("shmget");
        exit(EXIT_FAILURE);
    }
    
    pid = fork();

    if(pid == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(pid == 0)
    {
        sleep(3);

        struct shmid_ds buf;
        
        if(shmctl(shmid, IPC_STAT, &buf) == -1)
        {
            perror("shmctl");
            exit(EXIT_FAILURE);
        }

        printf("the creator is %d\n", buf.shm_cpid);

        shmaddr = (char*)shmat(shmid, NULL, 0);

        if((int)shmaddr == -1)
        {
            perror("shmat");
            exit(EXIT_FAILURE);
        }

        printf("i am the child %d, i got message \"%s\" from %d\n", 
            getpid(), shmaddr, buf.shm_lpid);

        shmdt(shmaddr);
        return 0;
    }
    else
    {
        shmaddr = (char*)shmat(shmid, NULL, 0);
        
        if((int)shmaddr == -1)
        {
            perror("shmat");
            exit(EXIT_FAILURE);
        }

        strcpy(shmaddr, "i am the parent");
        
        shmdt(shmaddr);
        wait(NULL);
        return 0;
    }
}
  • Memory Map
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>

int main(int argc, char** argv)
{
    char *addr;
    int pid;
    
    addr = mmap(0, 512, PROT_READ | PROT_WRITE, 
            MAP_SHARED | MAP_ANONYMOUS, -1, 0);
        
    pid = fork();

    if(pid == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(pid == 0)
    {
        sleep(3);
        printf("i am the child %d, i got the message \"%s\"\n",
             getpid(), addr);
        return 0;
    }
    else
    {
        strcpy(addr, "i am the parent");
        printf("i am the parent %d\n", getpid());
        wait(NULL);
        return 0;
    }
}
  • Domain Socket
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>

int main(int argc, char** argv)
{
    int socketfd[2];
    pid_t pid;
    char buf[64];

    if(socketpair(AF_UNIX, SOCK_STREAM, 0, socketfd) == -1)
    {
        perror("socketpair");
        exit(EXIT_FAILURE);
    }

    pid = fork();

    if(pid == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(pid == 0)
    {
        sleep(3);

        char message[]  = "child to parent";

        close(socketfd[0]);

        if(read(socketfd[1], buf, sizeof(buf)) < 0)
            perror("read");
    
        if(write(socketfd[1], message, sizeof(message)) < 0)
            perror("write");

        printf("child %d got message \"%s\"\n", getpid(), buf);

        close(socketfd[1]);
        return 0;
    }
    else
    {
        char message[] = "parent to child";

        close(socketfd[1]);
        
        if(write(socketfd[0], message, sizeof(message)) < 0)
            perror("write");

        if(read(socketfd[0], buf, sizeof(buf)) < 0)
            perror("read");

        printf("parent %d got message \"%s\"\n", getpid(), buf);

        close(socketfd[0]); 
        wait(NULL);
        return 0;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容