1 undefined reference to `pthread_create'
因爲pthread 庫不是 Linux 系統默認的庫,鏈接時須要使用靜態庫 libpthread.a,因此在使用pthread_create()建立線程,以及調用 pthread_atfork()函數創建fork處理程序時,在編譯中要加 -lpthread參數。php
例如:在加了頭文件#include <pthread.h>以後執行 pthread.c文件,須要使用以下命令: gcc thread.c -o thread -lpthreadhtml
這種狀況相似於<math.h>的使用,需在編譯時加 -m 參數。
linux
pthread_create()和pthread_atfork()函數使用時應注意的問題:安全
#include <pthread.h>
void pmsg(void* p)
{
char *msg;
msg = (char*)p;
printf("%s ", msg);
}
int main(int argc, char *argv)
{
pthread_t t1, t2;
pthread_attr_t a1, a2;
char *msg1 = "Hello";
char *msg2 = "World";
pthread_attr_init(&a1);
pthread_attr_init(&a2);
pthread_create(&t1, &a1, (void*)&pmsg, (void*)msg1);
pthread_create(&t2, &a2, (void*)&pmsg, (void*)msg2);
return 0;
}
gcc thread.c
/tmp/ccFCkO8u.o: In function `main':
/tmp/ccFCkO8u.o(.text+0x6a): undefined reference to `pthread_create'
/tmp/ccFCkO8u.o(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status
2 strerror問題
頭文件 #include <error.h>多線程
該文件定義了errno (即error number)對應的數值得含義.函數
在單線程程序中, errno在error.h中定義爲一個全局變量 int. 在多線程程序中, 只要有_REENTRANT宏, errno被擴展爲一個函數, 每一個線程都有本身局部存儲的errno. 總之, 在Linux中errno是線程安全的, 每一個線程都有本身的錯誤碼,放心使用.
測試
strerror(errno) 顧名思義, 就是把錯誤碼轉換爲有意義的字符串. spa
perror("your message") 在打印完你本身的錯誤信息your message後, 會把錯誤碼對應的字符串信息也打印出來, 即:printf("your message"), then strerror(errno) 因此, perro最好使, 很好,很強大~~
線程
#include <stdio.h> // void perror(const char *msg);
#include <string.h> // char *strerror(int errnum);
#include <errno.h> //errnoorm
errno 是錯誤代碼,在 errno.h頭文件中;
perror是錯誤輸出函數,輸出格式爲:msg:errno對應的錯誤信息(加上一個換行符);
strerror 是經過參數 errnum (就是errno),返回對應的錯誤信息。
如下是測試程序:
--------------------------------------------------------------------
// p_str_error.c
// perror , strerror 函數 , errno 測試
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
FILE *fp;
char *buf;
if( (fp = fopen(argv[1], "r")) == NULL)
{
perror("perror"); // 好方便
errno = 12;
printf("strerror: %s\n", strerror(errno)); //轉換錯誤碼爲對應的錯誤信息
exit(1);
}
perror("perror");
errno = 13;
printf("strerror: %s\n", strerror(errno));
fclose(fp);
return 0;
}
輸入一個存在的文件名,如:./a.out 111
open失敗則會輸出:
perror: No such file or directory
strerror: Cannot allocate memory
open成功則會輸出:
perror: Success
strerror: Permission denied
很明顯,perror信息是由 perror函數輸出的了,第二行是 strerror經過將 errno 輪換成對應的錯誤信息打印出來。