程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux編程-回憶錄六,linux編程回憶錄

Linux編程-回憶錄六,linux編程回憶錄

編輯:關於C語言

Linux編程-回憶錄六,linux編程回憶錄


====IPC====
#include <unistd.h>
int pipe(int filedes[2]);
創建PIPIE,filedes[0]用於讀,filedes[1]用於寫,成功
返回0,-1失敗;一般用於進程間的交互,比如shell之間
PIPE是一種單向的,容量有限制的流

#include <stdio.h>
FILE *popen(const char *command, const char *mode);
創建一個子進程執行SHELL命令,並建立和它之間的管道,返回
一個文件流,返回NULL出錯
int pclose(FILE *stream);
關閉PIPE文件流, 返回子進程的狀態,-1出錯

include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
創建一個FIFO管道,成功返回0,-1出錯
通常關聯兩個不相關的兩個程序,共享數據,也和PIPE一樣
容量有限的傳輸,不能用於大量的字節流

#include <sys/ipc.h>
key_t ftok(char *pathname, int proj);
創建一個唯一IPC KEY,返回0成功,-1出錯

#include <sys/types.h> /* For portability */ #include <sys/msg.h>
int msgget(key_t key, int msgflg);
得到消息表示ID號,返回-1表示出錯

#include <sys/types.h> /* For portability */ #include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
發送消息,返回0成功,-1出錯

#include <sys/types.h> /* For portability */ #include <sys/msg.h>
ssize_t msgrcv(int msqid, void *msgp, size_t maxmsgsz, long msgtyp, int msgflg);
接受消息,返回拷貝的字節數,返回-1出錯

#include <sys/types.h> /* For portability */ #include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
設置IPC MSG隊列的控制選項,返回0成功,-1出錯

#include <sys/types.h> /* For portability */ #include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
得到一個信號量ID值,返回-1出錯

#include <sys/types.h> /* For portability */ #include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ... /* union semun arg */);
設置信號量的選項值,返回-1出錯

#include <sys/types.h> /* For portability */ #include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned int nsops);
設置信號量的操作,返回0成功,-1出錯

#include <sys/types.h> /* For portability */ #include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
得到共享內存的ID號,返回-1表示出錯

#include <sys/types.h> /* For portability */ #include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
得到共享內存的地址信息,返回-1表示出錯

#include <sys/types.h> /* For portability */ #include <sys/shm.h>
int shmdt(const void *shmaddr);
移除共享內存的相關信息,不在使用,返回-1出錯,0成功

#include <sys/types.h> /* For portability */ #include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
設置共享內存的配置選項,返回0成功,-1出錯

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
創建一份內存映射,返回MAP_FAILED 表示出錯

#include <sys/mman.h>
int munmap(void *addr, size_t length);
解除內存映射,成功返回0,-1出錯

#include <fcntl.h> /* Defines O_* constants */ #include <sys/stat.h> /* Defines mode constants */ #include <sys/mman.h>
int shm_open(const char *name, int oflag, mode_t mode);
創建或是打開已有的,共享內存對象,返回文件描述符,-1出錯

#include <sys/mman.h>
int shm_unlink(const char *name);
移除共享內存對象,返回0成功,-1失敗

====文件鎖====
#include <sys/file.h>
int flock(int fd, int operation);
對文件進行operation類型的鎖操作
1.LOCK_SH   放置共享鎖
2.LOCK_EX   放置遞歸鎖
3.LOCK_UN   解鎖
4.LOCK_NB   無阻塞鎖
操作成功返回0,失敗返回-1值

====終端====
#include <termios.h>
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
獲取/設置終端的配置信息,返回0成功,-1失敗

#include <termios.h>
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
獲取終端波特率
int cfsetospeed(struct termios *termios_p, speed_t speed);
int cfsetispeed(struct termios *termios_p, speed_t speed);
設置波特率,成功返回0,-1失敗

#include <termios.h>
int tcsendbreak(int fd, int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int action);
終端行控制函數,返回0成功,-1失敗

#include <unistd.h>
int isatty(int fd);
判斷是否為一個終端,返回1是,0不是

#include <unistd.h>
char *ttyname(int fd);
返回終端的名稱,返回NULL表示出錯

#define _XOPEN_SOURCE 600
#include <stdlib.h>
#include <fcntl.h>
int posix_openpt(int flags);
打開一個沒被使用的偽終端,返回文件描述符,返回-1出錯

#define _XOPEN_SOURCE 500
#include <stdlib.h>
int grantpt(int mfd);
授權終端,用於兼容以前的模式,成功返回0,失敗返回-1值

#define _XOPEN_SOURCE 500
#include <stdlib.h>
int unlockpt(int mfd);
解鎖pseudoterminal master,用於能夠創建pseudoterminal slave
錯誤返回-1,成功返回0值

#define _XOPEN_SOURCE 500
#include <stdlib.h>
char *ptsname(int mfd);
得到pseudoterminal slave的終端名稱

====高級IO====
#include <sys/time.h> /* For portability */
#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
    fd_set *exceptfds, struct timeval *timeout);
多路轉接復用,告訴內核關心的文件描述符,當它們中的一個或是多個
准備好了,便返回給調用者
nfds        最大描述符+1
readfds     可讀的文件描述符集合
writefds    可寫的文件描述符集合
exceptfds   處理異常的文件描述符集合
timeout     ==NULL,永遠等待,直到捕獲信號,或是關心的文件描述已經准備好了
            !=NULL,如果tv_sec==0&&tv_usec==0,測試後立即返回,否則等待指定的時間
返回准備就緒的文件描述符數,超時返回0,返回-1表示出錯

#include <sys/select.h>
void FD_ZERO(fd_set *fdset);
void FD_SET(int fd, fd_set *fdset);
void FD_CLR(int fd, fd_set *fdset);
int FD_ISSET(int fd, fd_set *fdset);
清空文件描述符集合
添加文件描述符到集合中
從集合中移除文件描述符
測試文件描述符是否存在集合內,返回1存在,0不存在

#include <poll.h>
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
作用類似select函數,但它更簡潔,只構造一個文件描述符數組,每個
元素指定文件描述符和關心的狀態,函數返回就緒的文件描述符數,返回
0表示超時,-1出錯

上述兩個函數的缺點:
1.是必須輪詢所有的文件描述符集合/數組
2.每次調用都必須傳遞文件描述符相關信息給內核,內核修改狀態
後返回
3.返回後,函數需要檢查哪些文件描述符是已經就緒

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved