2.進程間通信--無名管道、信號

1.無名管道

int pipe(int pipefd[2]);

  • 條件:只適用于具有親緣關(guān)系的父子進程之間通信
  • IO :文件IO
  • 空間:無名管道在存在內(nèi)核區(qū)
  • 阻塞:當管道為空讀端阻塞, 當管道為滿寫端阻塞
  • 破裂:當讀端關(guān)閉,再次向管道寫數(shù)據(jù),管道破裂
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
    int fd[2];          //fd[0]:讀端  fd[1]:寫端
    char buf[32];
    if(pipe(fd) == -1)
    {
        perror("pipe error");
        exit(1);
    }

    pid_t pid = fork();
    if(pid == -1)
    {
        perror("fork error");
        exit(1);
    }
    else if(pid == 0)
    {
        //子:從終端讀取數(shù)據(jù),存到無名管道中
        while(1)
        {
            fgets(buf, sizeof(buf), stdin);
            write(fd[1], buf, 32);
            if( strncmp(buf, "quit", 4) == 0) 
            {
                exit(0);
            }
        }
    }
    else
    {
        //父:從無名管道讀取數(shù)據(jù),將數(shù)據(jù)打印到終端
        while(1)
        {
            read(fd[0], buf, 32);
            if(strncmp(buf, "quit", 4) == 0)
            {
                exit(0);
            }
            printf("-----> ");
            fputs(buf, stdout);
        }
    }   
    return 0;
}

2.信號

#include <signal.h>

int kill(pid_t pid, int sig);

  • 功能:向指定進程或進程組發(fā)送指定信號
  • 參數(shù):pid > 0 :向指定進程發(fā)送一個信號
    pid = 0 :向同組下的所有進程發(fā)送信號(包括自己)
    pid = -1 :向可以發(fā)送的所有進程發(fā)送信號(除了1號進程)
    pid < -1 :向指定進程組下的所有進程發(fā)送信號,PGID = -pid_t
    sig:要發(fā)送的信號
  • 返回:成功return 0; 失敗return -1;

int raise(int sig); 給進程本身發(fā)送一個sig信號

unsigned int alarm(unsigned int seconds);

  • 功能:非阻塞模式,seconds秒之后發(fā)送SIGALRM信號給進程本身
    新的alarm會覆蓋之前的alarm操作
  • 返回:承接之前alarm()函數(shù)剩余的秒數(shù),作為返回值

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

  • 功能:用于捕捉信號,設(shè)置信號的處理方式
  • 注意:SIGKILL和SIGSTOP不可以被捕捉和忽略
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void handler(int sig)           //捕捉到的信號傳遞給sig
{
    if(sig == SIGINT)
    {
        puts("catch SIGINT");
    }
    if(sig == SIGTSTP)
    {
        puts("catch SIGTSTP");
    }
}

int main(int argc, const char *argv[])
{
    if(signal(SIGINT, handler) == SIG_ERR)      //ctrl + c  -->handler
    {
        perror("signal error");
        exit(1);
    }
    if(signal(SIGTSTP, handler) == SIG_ERR)     //ctrl + z  -->handler
    {
        perror("signal error");
        exit(1);
    }
    if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)     //ctrl + \  ---> 默認
    {
        perror("signal error");
        exit(1);
    }
    printf("hello\n");
    while(1);
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 進程間的通信主要分為本機器進程間的通信和不同機器間進程的通信。本文主要描述本機進程間的通信。 一、傳統(tǒng)Linux的...
    一葉之界閱讀 497評論 0 2
  • 又來到了一個老生常談的問題,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢? 今天就這個問題開始,來談談操...
    tangsl閱讀 4,322評論 0 23
  • 21天前 ?【見證第??一天】 我,如意,成功的看到、聽到、感覺到了二十一天后我可以蛻變成為一名微商特種兵!為此目...
    如意_920d閱讀 487評論 0 0
  • 1.解表類:推三關(guān)、揉外勞宮、清天河水、揉二扇門、風池、風府、下推天柱骨、太陽穴、耳后高骨、迎香、擦大椎、拿肩井。...
    shm_shm閱讀 5,512評論 0 0
  • 心腦腹 心 ,感性,助人型,成功型,浪漫型 腦,理性,思維型,懷疑型,歡樂型 腹,中間,完美型,和平型,領(lǐng)袖型

友情鏈接更多精彩內(nèi)容