pthread_create、readlink、getpid等函數的學習與總結

來源:互聯網
上載者:User

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[i]);
        if (buf[i] == '/')
        {
            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

 

 

===============================================================================

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.