本文目錄一覽:
- 1、關於PHP的三目運算,究竟是怎樣的?
- 2、如何解決bus error
- 3、liunx下怎麼裝mysql出現bus error
- 4、php列表查詢 有選擇性的綁定數據集,輸出動態表格,結果資料庫里的內容全部輸出,沒有經過篩選,怎麼回事?
- 5、Linux下iconv bus error該如何解決
關於PHP的三目運算,究竟是怎樣的?
你可以吧你的代碼精簡下,比如如下:
?php
$arg = ‘B’;
$vehicle =(( $arg == ‘B’ ) ? ‘bus’ : ( $arg == ‘A’ )) ? ‘airplane’ : ‘feet’;
echo $vehicle;
這樣看就很明顯了,先執行括弧中的三目運算。
如何解決bus error
一,Bus Error究竟是指什麼
Bus Error,即匯流排錯誤。
引發原因:
CPU處於性能方面的考慮,要求對數據進行訪問時都必須是地址對齊的。如果發現進行的不是地址對齊的訪問,就會發送SIGBUS信號給進程,使進程產生 core dump。RISC包括SPARC(一種微處理器架構)都是這種類型的晶元。x86系列CPU都支持不對齊訪問,也提供了開關禁用這個機制。x86架構不要求對齊訪問的時候,必定會有性能代價。例如,對int的訪問應該是4位元組對齊的,即地址應該是4的倍數,對short則是2位元組對齊的,地址應該是2的倍數。
Bus Error也有可能是因為機器物理問題或者訪問無效物理地址,但這種情況非常少見。
Linux平台上執行malloc(),如果沒有足夠的RAM,Linux不是讓malloc()失敗返回,而是向當前進程分發SIGBUS信號。
注: 對該點執懷疑態度,有機會可自行測試確認當前系統反應。
SIGBUS與SIGSEGV信號的一般區別如下:
1) SIGBUS(Bus error)意味著指針所對應的地址是有效地址,但匯流排不能正常使用該指針。通常是未對齊的數據訪問所致。
2) SIGSEGV(Segment fault)意味著指針所對應的地址是無效地址,沒有物理內存對應該地址。
二,例子程序:
1 int main(){
2
3
4
5
6 #if defined(__GNUC__)
7 # if defined(__i386__)
8
9 __asm__(“pushf/norl $0x40000,(%esp)/npopf”);
10 # elif defined(__x86_64__)
11
12 __asm__(“pushf/norl $0x40000,(%rsp)/npopf”);
13 # endif
14 #endif
15
16
17
18
19
20
21
22
23
24 short array[16];
25
26 int * p = (int *) array[1];
27 *p = 1;
28
29 return 1;
30 }
short類型大小為2個位元組,其地址必是2的倍數。而對於int指針來說,能夠使用以訪問數據的地址應該是4的倍數,轉化arrary[1]的地址為int *並訪問,系統會發出SIGBUS信號,導致程序崩潰。
wiki上的例子:
#include stdlib.h
int main( int argc, char ** argv) {
int * iptr;
char * cptr;
#if defined(__GNUC__)
# if defined(__i386__)
__asm__( “pushf/n orl $0x40000,(%esp)/n popf” ) ;
# elif defined(__x86_64__)
__asm__( “pushf/n orl $0x40000,(%rsp)/n popf” ) ;
# endif
#endif
cptr = malloc( sizeof ( int ) + 1) ;
iptr = ( int * ) ++ cptr;
* iptr = 42 ;
return 0 ;
}
$ gcc -ansi sigbus.c -o sigbus
$ ./sigbus
Bus error
$ gdb ./sigbus
(gdb) r
Program received signal SIGBUS , Bus error.
0x080483ba in main ()
(gdb) x/i $pc
0x80483ba main+54: mov DWORD PTR [eax],0x2a
(gdb) p/x $eax
$1 = 0x804a009
(gdb) p/t $eax (sizeof(int) – 1)
$2 = 1
三,編譯器和硬體平台相關性
上述已經描述,對於x86平台,默認允許非對齊訪問,只不過會有性能代價。開啟檢測可以使用上述代碼中的宏。
這段程序如果用Sun Studio編譯器的話,運行就沒有問題。這是因為Sun Studio默認對32位編譯使用的參數是-xmemalign=8i,其中i選項設置明確指明不產生SIGBUS信號。
不過如果編譯成64位程序,Sun Studio使用的-xmemalign=8s,其中s選項設置意味對這種非對齊訪問產生SIGBUS信號,則仍舊會遇到這個錯誤。
如果堅持在SPARC上使用GCC去編譯這種代碼,可以如下進行:
GCC有一個Type Attributes特性,例如在需人工對齊的變數後加上:__attribute__ ((aligned (4))); 其意義就是指定偏移量為4的倍數。比如:
short array[10] __attribute__ ((aligned (4)));
不過這個屬性只對Linker連接器可見的變數有效,也就是說對local variable無效。而且這種特性作用粒度比較大,比如這裡只對第一個元素有作用,並不為數組的每個成員設置偏移量。如果一定要針對local variable或者數組的每個成員進行偏移量設置,可以使用union類型:
union {
short s;
int i;
}
liunx下怎麼裝mysql出現bus error
Linux下不使用dll形式,你需要安裝php_mysql,如果是Redhat系列的話就用yum installl php_mysql,如果是Debian系列的話就用apt-get來安裝
php列表查詢 有選擇性的綁定數據集,輸出動態表格,結果資料庫里的內容全部輸出,沒有經過篩選,怎麼回事?
bus.design 多了個” 還有where bus.design=%s要換成where bus.disign=a.b這種形式的
Linux下iconv bus error該如何解決
bus error 是匯流排錯誤,這個錯誤一般是程序無法有效兼容當前 CPU 的工作而報錯。
這隻能刪了這個軟體重新裝。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238336.html