pthread_create是UNIX環境創建線程函數
具體格式:
#include<pthread.h>
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void*(*start_rtn)(void*),void *restrict arg);
返回值:若成功則返回0,否則返回出錯編號
返回成功時,由tidp指向的內存單元被設置為新創建線程的線程ID。attr參數用於制定各種不同的線程屬性。新創建的線程從start_rtn函 數的地址開始運行,該函數只有一個無指針參數arg,如果需要向start_rtn函數傳遞的參數不止一個,那麼需要把這些參數放到一個結構中,然後把這 個結構的地址作為arg的參數傳入。
linux下用C開發多線程程序,Linux系統下的多線程遵循POSIX線程接口,稱為pthread。
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg);
Returns: 0 if OK, error number on failure
由 restrict 修飾的指針是最初唯一對指針所指向的對象進行存取的方法,僅當第二個指針基於第一個時,才能對對象進行存取。對對象的存取都限定於基於由 restrict 修飾的指針表達式中。 由 restrict 修飾的指針主要用於函數形參,或指向由 malloc() 分配的內存空間。restrict 數據類型不改變程序的語義。 編譯器能通過作出 restrict 修飾的指針是存取對象的唯一方法的假設,更好地優化某些類型的例程。
第一個參數為指向線程標識符的指針。
第二個參數用來設置線程屬性。
第三個參數是線程運行函數的起始地址。
最後一個參數是運行函數的參數。
另外,在編譯時注意加上-lpthread參數,以調用靜態鏈接庫。因為pthread並非Linux系統的默認庫
===============================================================================linux關於readlink函數獲取運行路徑
相關函數: stat, lstat, symlink
表頭文件: #include <unistd.h>
定義函數:int readlink(const char *path, char *buf, size_t bufsiz);
函數說明:readlink()會將參數path的符號連接內容到參數buf所指的內存空間,返回的內容不是以NULL作字符串結尾,但會將字符串的字符數返回。若參數bufsiz小於符號連接的內容長度,過長的內容會被截斷
返回值:執行成功則傳符號連接所指的文件路徑字符串,失敗返回-1, 錯誤代碼存於errno
錯誤代碼:
EACCESS 取文件時被拒絕,權限不夠
EINVAL 參數bufsiz為負數
EIO O存取錯誤
ELOOP 欲打開的文件有過多符號連接問題
ENAMETOOLONG 參數path的路徑名稱太長
ENOENT 參數path所指定的文件不存在
ENOMEM 核心內存不足
ENOTDIR 參數path路徑中的目錄存在但卻非真正的目錄
例一:
#include <stdio.h>
#include <unistd.h>
#define PATH_MAX 1024
char * get_exe_path()
{
static char buf[PATH_MAX];
int i;
int rslt = readlink("/proc/self/exe", buf, PATH_MAX);
if (rslt < 0 || rslt >= PATH_MAX)
{
return NULL;
}
buf[rslt] = '/0';
for (i = rslt; i >= 0; i--)
{
printf("buf[%d] %c/n", i, buf);
if (buf == '/')
{
buf[i + 1] = '/0';
break;
}
}
return buf;
}
int main(int argc, char ** argv)
{
printf("%s/n", get_exe_path());
return 0;
}
===============================================================================
getpid 取得進程識別碼
相關函數: fork,kill,getpid 表頭文件: #include<unistd.h>
定義函數: pid_t getpid(void);
函數說明:
getpid()用來取得目前進程的進程識別碼,許多程序利用取到的 此值來建立臨時文件,以避免臨時文件相同帶來的問題。
返回值: 目前進程的進程識別碼
范例:
#include<unistd.h>
main()
{
printf(“pid=%d/n”,getpid());
}
執行:
pid=1494 /*每次執行結果都不一定相同*/
===============================================================================
strrchr()函數
定義和用法
strrchr()函數的作用是:查找一個字符串在另一個字符串中末次出現的位置,並返回從字符串中的這個位置起, 一直到字符串結束的所有字符。 如果未能找到指定字符,那麼函數將返回NULL。
語法
char *strrchr(char *str, char c);
例子
#include <string.h>
#include <stdio.h>
int main(void)
char string[16];
char *ptr, c = 'r';
strcpy(string, "This is a string");
ptr = strrchr(string, c);
if (ptr)
printf("The character %c is at position: %d/n", c, ptr-string);
else
printf("The character was not found/n");
return 0;
}
運行結果是:The character r is at position:12
===============================================================================
strstr()函數用法
c++函數原型:
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
C函數原型:
char * strstr ( const char *, const char * );
a字符串裡 查看是否有b字符串,
有則 從首次發現b字符串處 返回 a字符串。
沒有則輸出 null
例子:
char st[]="abc 1234 xyz";
printf("%s",strstr(st,"34") );
打印出:
34 xyz