Linux C 一些函數 所屬的頭文件


在編寫程序時,有時總是不記得所使用的函數在哪個庫函數中。現在先把自己以前經常用到的函數頭文件總結一下。 有不對的地方還請指教。

 

 

1,系統調用文件的操作函數

#inlclude <fcntl.h>

int open(char *name,int how) 第二個參數,O_RDONLY O_WRONLY O_RDWRO_CREAT

#include <unistd.h>

int close(int fd)

size_t read(int fd,void *buf, size_t count)

size_t write(int fd,const void *buf,size_tcount)

sleep(1) 系統睡眠一秒鍾,最小單位為一秒。

#define msleep(x) usleep(x*1000)

msleep(500); 系統睡眠0.5秒

 

#include <stdio.h>

perror("會出現錯誤的函數名")

#include <string.h>

char *strerror(int errnum) 依據錯誤代碼errnum來查找錯誤原因字符串

char *strcpy(char *dest,const char *src)

int strcmp(char *s1,const char *s2) s1若等於s2的值則返回0值

int strncmp(char *s1,const char *s2,int n) 前n個字符串比較

 

2,進程控制函數

#include <unistd.h>

pid_t fork(void) 子進程中返回0 父進程中返回子進程ID 出錯返回-1

pid_t getpid(void)  pid_t getppid(void)

pid_t vfork(void)

exec函數族

進程pid 的類型為pid_t 類型,它包含於#include <sys/types.h> 若定義一個進程pid變量,則需要包含此頭文件

 

exit(n)結束進程父進程可以由wait函數來獲得子進程結束裝狀態。

在進程結束的時候,會關閉文件描述符號,做一些清理工作,只保留進程返回狀態等信息

調用exit(),子進程會關閉所有打開的進程描述符  exit會作清理工作,比如說,釋放內存(在C++里面會主動的調用析構函數,),關閉文件句柄的工作,包括刷新IO流。

_exit(n)直接退出,不會做一些清理工作,也不會關閉文件描述符。

#include <sys/wait.h>

pid_t wait(int *status) 等待任意子進程結束。子進程結束狀態值由status返回。

如WEXITSTATUS(status)可以獲得exit(2)中返回的值,status=2,這樣就可以知道所等待的為哪個進程。如果不用這個宏轉換,則status=512.

pid_t waitpid(pid_t pid,int status,intoptions)  可以指定等待某個進程號pid的進程結束

在使用 waitpid函數時還用到了pid參數,所以還要加上#include<sys/types.h>

關於進程等待函數還有很多宏將status轉換為需要的值,需要了解。

 

3,進程間通信-管道

#include <unistd.h>

int pipe(int filedes[2])

 

4,進程間通信-命名管道

#include <sys/types.h> #include<sys/stat.h>

int mkfifo(const char *pathname,mode_tmode)

對於命名管道的操作同普通文件的操作

 

5,消息隊列

數據類型key_t是在頭文件sys/types.h中定義的,它是一個長整形的數據。

key=ftok(".",'A')  #include <sys/types.h> #include<sys/ipc.h>

 

所屬頭文件:#include<sys/types.h>#include <sys/ipc.h> #include <sys/msg.h>

int msgid;

msgid=msgget(key, IPC_CREAT | IPC_EXCL |0666);

struct msg

{

   long mtype;

   char mtext[50];

}msg1,msg2; //消息隊列緩沖區

int rcvtype=1;

msgsnd(msgid,&msg1,6,0)  6個字節,最后一個參數填寫為0表示函數調用阻塞直到滿足條件為止。

msgrcv(msgid,&msg2,6,rcvtype,0)   最后一個參數也可為IPC_NOWAIT,沒有收到消息返回-1

msgctl(msgid,IPC_RMID,NULL);  刪除消息隊列

 

6,進程間通信-信號

#include <signal.h>

 

int kill(pid_t pid,int sig)

int raise(int signo);進程向自身發送信號

raise(signo)等價於kill(getpid(),signo);

 

alarm(2) 定時兩秒后,產生SIGALRM信號,系統默認處理是結束進程。

 

int pause(void) //pause函數使調用進程掛起直至捕捉到一個信號。

signal(SIGINT,ctrl_c)  ctrl_c為函數名功能:發出信號后,調用信號處理函數

 

7,信號集函數組  阻塞信號

信號集數據結構的定義,sigset_t為結構體數據類型

sigset_t intmask;

sigemptyset(&intmask);

sigaddset(&intmask,SIGINT);

sigdelset(&intmask,SIGINT);

sigprocmask(int how,const sigset_t*set,sigset_t *oset)

sigpromask(SIGBLOCK,&intmask,NULL)

 

8,線程

#include <pthread.h>

線程ID類型為 pthread_t 為結構體類型

獲得線程ID的辦法 pthread_t tid;tid=pthread_self();

 

pthread_create(&tid,NULL,thread,NULL)  第二個參數為線程屬性,第三個參數為線程。第四個參數是可以向該線程傳遞參數。   線程 void *thread(void *arg)

pthread_exit((void *)2)  //與return((void *)2)的區別?誰可以解答。。。

void *tret;

pthread_join(tid,&tret);

pthread_cancel(tid);

pthread_cleanup_push(fun,NULL);第一個參數為清理函數,第二個為傳參,線程清理處理程序

pthread_cleanup_pop(0); 0表示線程結束時不執行清理函數,非0執行,兩函數配對使用。

調用pthread_exit時,或響應取消時,即使是pthread_cleanup_pop(0);也執行清理函數。

 

互斥鎖

互斥鎖類型為pthread_mutex_t mutex1

pthread_mutex_init(&mutex1,NULL) 互斥鎖的創建,第二個參數為空,表示默認屬性。

pthread_mutex_destory(&mutex1) 清除一個互斥鎖

pthread_mutex_lock(&mutex1)

pthread_mutex_unlock(&mutex1)

 

信號量

#include <semaphore.h>

信號量的類型 sem_tsem1;

sem_init(&sem1,0,n) 信號量的初始化,第二個參數Linux沒能實現在進程間信號量的共享,所以值為0。

第三個參數為無符號整型,n表示信號量初始化的值

sem_wait(&sem1)  P操作

sem_post(&sem1)  V操作

用PV實現線程間的互斥與同步功能

int sem_getvalue(sem_t *sem) 取得信號量的值

int sem_destroy(sem_t *sem) 刪除信號量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM