linux c/c++面試知識點整理(五)

41、linux系統(tǒng)進程間有哪些通信方式

? ? ? ?管道笔宿、有名管道犁钟、消息隊列、信號泼橘、共享內存涝动、socket、文件
? ? ? ?管道及有名管道:管道可用于具有親緣關系進程間的通信炬灭,例如父子進程醋粟,但是有名管道允許無關系的進程間通信。管道其實就是建立一個FIFO文件重归,一個進程往里面寫數(shù)據(jù)米愿,另外的進程讀取數(shù)據(jù)。
demo如下:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <stdlib.h>

void sys_err(const char *str)
{
    perror(str);
    exit(1);
}

int main()
{
    pid_t pid;
    char buf[1024];
    int fd[2];
    char *p = "test for pipe\n";
    if (pipe(fd) == -1)
        sys_err("pipe");

    pid = fork();
    if (pid < 0) 
    {
        sys_err("fork err");
    }
    else if(pid == 0)
    {
        //父進程   
        close(fd[1]);
        int len = read(fd[0], buf, sizeof(buf));
        write(STDOUT_FILENO, buf, len);  //輸出到屏幕
        close(fd[0]);
    }
    else
    {
        //子進程
        close(fd[0]);
        write(fd[1], p, strlen(p)); //寫入test for pipe
        wait(NULL);
        close(fd[1]);
    }

    return 0;
}

? ? ? ?消息隊列:也叫報文隊列鼻吮,消息隊列是消息的鏈接表育苟,包括Posix消息隊列和SystemV消息隊列,有足夠權限的進程可以向隊列中添加消息椎木,被賦予讀權限的進程則可以讀走隊列中的信息违柏,消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點香椎。
發(fā)送消息demo如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct my_msg_st
{
    long int my_msg_type;
    char some_text[BUFSIZ];
};

int main(void)
{
    int running = 1;
    struct my_msg_st some_data;
    int msgid = 0;
    char buffer[BUFSIZ] = {0};
    memset((void*)&some_data, 0, sizeof(some_data));

    /*創(chuàng)建消息隊列*/
    msgid=msgget((key_t)1234,0666 | IPC_CREAT);
    if(msgid==-1)
    {
        fprintf(stderr,"msgget failed with error:%d\n",errno);
        exit(EXIT_FAILURE);
    }

    /*循環(huán)向消息隊列中添加消息*/
    while(running)
    {
        memset(buffer, 0, sizeof(buffer));
        printf("Enter some text:");
        fgets(buffer,BUFSIZ,stdin);
        some_data.my_msg_type=1;
        strcpy(some_data.some_text,buffer);

        /*添加消息*/
        if(msgsnd(msgid,(void *)&some_data,BUFSIZ,0)==-1)
        {
            fprintf(stderr,"msgsed failed\n");
            exit(EXIT_FAILURE);
        }

        /*用戶輸入的為“end”時結束循環(huán)*/
        if(strncmp(buffer,"end",3)==0)
        {
            running=0;
        }
    }
    exit(EXIT_SUCCESS);
}

接收消息demo如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct my_msg_st
{
    long int my_msg_type;
    char some_text[BUFSIZ];
};

int main(void)
{
    int running=1;
    int msgid = 0;
    struct my_msg_st some_data;
    long int msg_to_receive=0;
    memset((void*)&some_data, 0, sizeof(some_data));

    /*創(chuàng)建消息隊列*/
    msgid=msgget((key_t)1234,0666 | IPC_CREAT);
    if(msgid==-1)
    {
        fprintf(stderr,"msgget failed with error: %d\n",errno);
        exit(EXIT_FAILURE);
    }
    
    /*循環(huán)從消息隊列中接收消息*/
    while(running)
    {
        /*讀取消息*/
        if(msgrcv(msgid,(void *)&some_data,BUFSIZ,msg_to_receive,0)==-1)
        {
            fprintf(stderr,"msgrcv failed with error: %d\n",errno);
            exit(EXIT_FAILURE);
        }

        printf("接收到的消息為: %s",some_data.some_text);

        /*接收到的消息為“end”時結束循環(huán)*/
        if(strncmp(some_data.some_text,"end",3) == 0)
        {
            running=0;
        }
    }

    /*從系統(tǒng)內核中移走消息隊列*/
    if(msgctl(msgid,IPC_RMID,0) == -1)
    {
        fprintf(stderr,"msgctl(IPC_RMID) failed\n");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

? ? ? ?信號:信號是比較復雜的通信方式勇垛,用于通知接收進程有某種事情發(fā)生,除了用于進程間通信外士鸥,進程還可以發(fā)送信號給進程本身闲孤;linux除了支持Unix早期信息語義函數(shù)signal外,還支持語義符合Posix 1標準的信號函數(shù)sigaction烤礁。
? ? ? ?共享內存:共享內存是一種文件映射讼积,使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式脚仔。是針對其他通信機制運行效率較低而設計的勤众。往往與其他通信機制,如信號量結合使用鲤脏,來達到進程間的同步及互斥们颜。
demo如下:
寫入共享內存:

#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include<errno.h>

typedef struct _Teacher
{
    char name[64];
    int age;
}Teacher;

int main(int argc, char *argv[])
{
    int ret = 0;
    int    shmid = 0;
    //創(chuàng)建共享內存 吕朵,相當于打開文件,文件不存在則創(chuàng)建
    shmid = shmget(0x2234, sizeof(Teacher), IPC_CREAT | 0666); 
    if (shmid == -1)
    {
        perror("shmget err");
        return errno;
    }
    printf("shmid:%d \n", shmid);
    Teacher *p = NULL;
    //將共享內存段連接到進程地址空間
    p = (Teacher*)shmat(shmid, NULL, 0);//第二個參數(shù)shmaddr為NULL窥突,核心自動選擇一個地址
    if (p == (void *)-1 )
    {
        perror("shmget err");
        return errno;
    }
    strcpy(p->name, "aaaa");
    p->age = 33;
    //將共享內存段與當前進程脫離
    shmdt(p);
        
    printf("鍵入1 刪除共享內存努溃,其他不刪除\n");
    
    int num = 0;
    scanf("%d", &num);
    if (num == 1)
    {
        //用于控制共享內存
        ret = shmctl(shmid, IPC_RMID, NULL);//IPC_RMID為刪除內存段
        if (ret < 0)
        {
            perror("rmerrr\n");
        }
    }                 

    return 0;    
}

從共享內存讀取:

#include<stdio.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include<errno.h>

typedef struct _Teacher
{
    char name[64];
    int age;
}Teacher;

int main(int argc, char *argv[])
{
    int ret = 0;
    int    shmid = 0;
    //打開獲取共享內存
    shmid = shmget(0x2234, 0, 0); 
    if (shmid == -1)
    {
        perror("shmget err");
        return errno;
    }
    printf("shmid:%d \n", shmid);
    Teacher *p = NULL;
    //將共享內存段連接到進程地址空間
    p = (Teacher*)shmat(shmid, NULL, 0);
    if (p == (void *)-1 )
    {
        perror("shmget err");
        return errno;
    }
    
    printf("name:%s\n", p->name);
    printf("age:%d \n", p->age);
    //將共享內存段與當前進程脫離
    shmdt(p);
    
    printf("鍵入1 程序暫停阻问,其他退出\n");
    
    while(1)
    {
        sleep(1);
    }       
    return 0;
}

? ? ? ?socket:socket也就是套接字梧税,最普遍的進程間通信機制,可用于不同機器之間的進程間通信称近。

42第队、為什么要使用linux作為服務器。

? ? ? ?首先刨秆,linux是免費的凳谦,而windows需要向微軟購買正版授權;
? ? ? ?其次衡未,linux比windows靈活晾蜘,可以實現(xiàn)很多定制化需求,因為linux可以修改系統(tǒng)內核眠屎;
? ? ? ?再次,很多高端服務器組件對linux支持的更好肆饶,windows版本的可能功能都不是很完整改衩;
? ? ? ?最后,linux開源驯镊,所以很多人為它添磚加瓦葫督,幾乎你需要的功能都能找到linux的版本并且都是開源免費的。

43板惑、mysql數(shù)據(jù)庫的引擎

? ? ? ?你能用的數(shù)據(jù)庫引擎取決于mysql在安裝的時候是如何被編譯的橄镜。要添加一個新的引擎,就必須重新編譯mysql冯乘,在缺省情況下洽胶,mysql支持三個引擎:ISAM、MYISAM和HEAP裆馒,另外兩種類型INNODB和BERKLEY姊氓,也常常可以使用喷好。

  • ISAM
    ? ? ? ?ISAM是一個定義明確且歷經時間考驗的數(shù)據(jù)庫表格管理方法翔横,它在設計之時就考慮到數(shù)據(jù)庫被查詢的次數(shù)要遠大于更新的次數(shù)。因此梗搅,ISAM執(zhí)行讀取操作的速度很快禾唁,而且不占用大量的內存和存儲資源效览。ISAM的兩個主要不足之處在于,它不支持事務處理荡短,也不能夠容錯丐枉,如果你的硬盤崩潰了,那么數(shù)據(jù)文件就無法恢復了肢预。如果你正在把ISAM用在關鍵任務應用程序里矛洞,那就必須經常備份你所有的實時數(shù)據(jù),通過其復制特性烫映,Mysql能夠支持這樣的備份應用程序沼本。
  • MYISAM
    ? ? ? ?MYISAM是MySQL的ISAM擴展格式和缺省的數(shù)據(jù)庫引擎,除了提供ISAM里所沒有的索引和字段管理的大量功能锭沟,MYISAM還使用一種表格鎖定的機制抽兆,來優(yōu)化多個并發(fā)的讀寫操作。其代價是你需要經常運行OPTIMIZE TABLE命令族淮,來恢復被更新機制所浪費的時間辫红。MYISAM還有一些有用的擴展,例如用來修復數(shù)據(jù)庫文件的MYISAMCHK工具和用來恢復浪費空間的MYISAMPACK工具祝辣。
    ? ? ? ?MYISAM強調了快速讀取操作贴妻,這可能就是為什么MYSQL受到了WEB開發(fā)如此青睞的主要原因,在WEB開發(fā)中你所進行的大量數(shù)據(jù)操作都是讀取操作蝙斜。所以名惩,大多數(shù)虛擬主機提供商和INTERNET平臺提供商只允許使用MYISAM格式。
  • HEAP
    ? ? ? ?HEAP允許只駐留在內存里的臨時表格孕荠。駐留在內存使得HEAP比ISAM和MYISAM的速度都快娩鹉,但是它所管理的數(shù)據(jù)是不穩(wěn)定的,而且如果在關機之前沒有進行保存稚伍,那么所有的數(shù)據(jù)都會丟失弯予。在數(shù)據(jù)行被刪除的時候,HEAP也不會浪費大量的空間个曙,HEAP表格在你需要使用SELECT表達式來選擇和操控數(shù)據(jù)的時候非常有用锈嫩。要記住,用完表格后要刪除表格垦搬。
  • INNODB和BERKLEYDB
    ? ? ? ?INNODB和BERKLEYDB數(shù)據(jù)庫引擎都是造就MYSQL的靈活性技術的直接產品祠挫,這項技術就是mysql++API。在使用mysql的時候悼沿,你所面對的每一個挑戰(zhàn)幾乎都源于ISAM和MYISAM數(shù)據(jù)庫引擎不支持事務處理也不支持外來鍵等舔。盡管要比ISAM和MYISAM引擎慢很多,但是INNODB和BERKLEYDB包括了對事務處理和外來鍵的支持糟趾,這兩點都是前兩個引擎所沒有的慌植。如前所述甚牲,如果你的設計需要這些特性中的一者或者兩者,那你就要被迫使用后兩個引擎中的一個了蝶柿。

44丈钙、什么是紅黑樹?

? ? ? ?紅黑樹交汤,又叫RB樹雏赦,是一種特殊的二叉查找樹,可以自動排序芙扎,且紅黑樹的每個節(jié)點都有存儲位表示節(jié)點的顏色星岗,標識是紅或者黑。
? ? ? ?紅黑樹的特性:
? ? ? ?每個節(jié)點或者是黑色戒洼,或者是紅色俏橘;
? ? ? ?跟節(jié)點是黑色;
? ? ? ?每個葉子節(jié)點是黑色(這里葉子節(jié)點是指沒有子節(jié)點的葉子節(jié)點)圈浇;
? ? ? ?如果一個節(jié)點是紅色的寥掐,則它的子節(jié)點必為黑色的;
? ? ? ?從一個節(jié)點到該節(jié)點子孫節(jié)點的所有路徑上包含相同數(shù)目的黑節(jié)點磷蜀。

45召耘、C程序的內存分配方式

? ? ? ?由上到下(地址從高到低):棧、動態(tài)鏈接庫褐隆、堆污它、bbs(未初始化的全局變量)、數(shù)據(jù)段(存放初始化的全局變量)妓灌、文本段(存放代碼)

46、select和epoll的區(qū)別

? ? ? ?select函數(shù) int select(int n,fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout);
? ? ? ?第一個參數(shù)n代表最大的文件描述符+1
? ? ? ?fd_set是一個集合蜜宪,存放的是文件描述符
? ? ? ?readfds表示我們要監(jiān)視這些文件描述符里讀變化
? ? ? ?writefds表示我們要監(jiān)視它所指向的集合里面的文件描述符的寫變化
? ? ? ?errorfds表示要監(jiān)視文件描述符是否發(fā)生了錯誤異常
? ? ? ?timeout若為NULL虫埂,則select置于阻塞狀態(tài),直到監(jiān)視的某個文件描述符發(fā)生變化才返回
? ? ? ?timeout若等于0秒0毫秒圃验,則select是一個純粹的非阻塞函數(shù)掉伏,不管文件描述符是否變化,立即返回澳窑。
? ? ? ?timeout大于0時斧散,則在timeout時間內阻塞,timeout時間內若文件描述符有變化則返回摊聋,如果超時則立即返回
? ? ? ?返回值:負值 select發(fā)生錯誤
? ? ? ?正值 有文件描述符發(fā)生變化
? ? ? ?0 等待超時鸡捐,沒有可讀寫或者發(fā)生錯誤的文件描述符
? ? ? ?epoll函數(shù)與select函數(shù)最大的不同在于它不會隨著監(jiān)聽fd數(shù)目的增長而降低效率,并且select同時監(jiān)聽的fd數(shù)目是有限制的麻裁,默認最大是1024.
? ? ? ?int epoll_create(int size);//創(chuàng)建epoll句柄箍镜,參數(shù)size告訴內核這個監(jiān)聽的數(shù)目有多大源祈,但最新版本這個參數(shù)已經無用了
? ? ? ?int epoll_ctl(); //epoll的事件注冊函數(shù),它要先注冊需要監(jiān)聽的事件類型
? ? ? ?int epoll_wait();//等待事件的發(fā)生
? ? ? ?select是輪詢fd色迂,而epoll是先將文件描述符注冊到內核香缺,一旦文件描述符發(fā)生變化,內核會采用回調機制歇僧,激活這個文件描述符图张,這樣epoll_wait便會知道。
? ? ? ?epoll相對于select優(yōu)點:
? ? ? ?監(jiān)視的文件描述符不受限制诈悍,具體多少根內存有關
? ? ? ?IO的效率不會隨著監(jiān)視fd的數(shù)量的增加而降低
? ? ? ?mmap加速內核與用戶空間的信息傳遞祸轮,避免了多余的內存拷貝

47、linux下inode的說明

? ? ? ?每個磁盤空間都有一個inode表写隶,inode里面每一個節(jié)點存放該空間每個文件的信息倔撞,例如:文件的字節(jié)數(shù)、文件擁有者慕趴、所在的組痪蝇、權限、時間冕房、位置等躏啰。
? ? ? ?istat 命令查看單個文件;
? ? ? ?df –i查看磁盤空間inode的使用量耙册。

48给僵、IP、TCP详拙、UDP數(shù)據(jù)包大小

? ? ? ?MTU帝际,普通局域網最大傳輸單元,為1500個字節(jié)饶辙;
? ? ? ?IP數(shù)據(jù)包首部20個字節(jié)蹲诀,所以IP數(shù)據(jù)包一般是1480個字節(jié);
? ? ? ?TCP數(shù)據(jù)包首部20個字節(jié)弃揽,所以數(shù)據(jù)包大小為1460個字節(jié)脯爪;
? ? ? ?UDP數(shù)據(jù)包首部8個字節(jié),所以數(shù)據(jù)包大小我1472個字節(jié)矿微;
? ? ? ?注意:這里說的首部是固定長度痕慢,但后面還有一些可選字段。

49涌矢、memcache的特性

? ? ? ?服務器接到客戶端請求會先檢查memcached掖举,如有則直接返回,不再檢查DB
? ? ? ?如memcache沒有要找的數(shù)據(jù)娜庇,則檢查DB拇泛,查到以后返回給客戶端滨巴,并同時緩沖一份到memcache
? ? ? ?更新DB同時更新memcache,保證數(shù)據(jù)的一致性
? ? ? ?當分配給memcache內存空間用完之后俺叭,會根據(jù)LRU(最近最少使用)策略和到期失效策略恭取,先替換失效數(shù)據(jù),再替換最近最少使用數(shù)據(jù)
? ? ? ?memchche在內存中是一個巨大的hast表熄守,它其實就是讀數(shù)據(jù)庫改為直接讀內存蜈垮,提高讀取速度

50、什么是sql注入

? ? ? ?sql注入:用戶可以提交一段數(shù)據(jù)庫查詢代碼裕照,根據(jù)程序返回的結果攒发,獲得某些他想得知的數(shù)據(jù)。
? ? ? ?應對辦法:可以通過數(shù)據(jù)庫防火墻實現(xiàn)對sql注入攻擊的防范晋南,因為sql注入攻擊往往是通過應用程序來進攻惠猿,可以使用虛擬補丁技術實現(xiàn),對注入攻擊的sql特征識別负间,實現(xiàn)實時攻擊阻斷偶妖。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市政溃,隨后出現(xiàn)的幾起案子趾访,更是在濱河造成了極大的恐慌,老刑警劉巖董虱,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼鞋,死亡現(xiàn)場離奇詭異,居然都是意外死亡愤诱,警方通過查閱死者的電腦和手機云头,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淫半,“玉大人溃槐,你說我怎么就攤上這事〈榭” “怎么了竿痰?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵脆粥,是天一觀的道長砌溺。 經常有香客問我,道長变隔,這世上最難降的妖魔是什么规伐? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮匣缘,結果婚禮上猖闪,老公的妹妹穿的比我還像新娘鲜棠。我一直安慰自己,他們只是感情好培慌,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布豁陆。 她就那樣靜靜地躺著,像睡著了一般吵护。 火紅的嫁衣襯著肌膚如雪盒音。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天馅而,我揣著相機與錄音祥诽,去河邊找鬼。 笑死瓮恭,一個胖子當著我的面吹牛雄坪,可吹牛的內容都是我干的。 我是一名探鬼主播屯蹦,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼维哈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颇玷?” 一聲冷哼從身側響起笨农,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埋酬,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡含蓉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惶我。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锁摔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情哼审,我是刑警寧澤谐腰,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站涩盾,受9級特大地震影響十气,放射性物質發(fā)生泄漏。R本人自食惡果不足惜春霍,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一砸西、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦芹枷、人聲如沸衅疙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饱溢。三九已至,卻和暖如春走芋,著一層夾襖步出監(jiān)牢的瞬間理朋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工绿聘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗽上,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓熄攘,卻偏偏與公主長得像兽愤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挪圾,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容