linux运行多线程语句,linux多线程中使用system函数后时而程序崩溃,求助!!!...
本帖最后由 sz_hiter 于 2010-09-05 15:07:33 編輯
如題。
本程序有7個線程,其中一個線程(簡稱sys線程把。。)每秒會調用幾次system函數(shù)(例如system("df?-h?>?/tmp/tmpFlashInfo.file"),用于檢查Flash的占用情況)。
我主要做了如下的測試:
1、屏蔽sys線程后,其他線程一直運行,正常。
2、打開sys線程后,在調用system函數(shù)前,printf一句start,在調用system函數(shù)后,printf一句end,然后通過主板運行,串口打印的方式,發(fā)現(xiàn)每次出現(xiàn)崩潰的時候(時間不定,少則幾分鐘,多則幾小時),都是打印了start之后,但沒有end打印。同時通過core文件分析的崩潰原因是:
Program?terminated?with?signal?11,?Segmentation?fault.
#0??0x00989680?in????()
(gdb)?bt
#0??0x00989680?in????()
#1??0x4002ce6c?in????()?from?/lib/libpthread.so.0
(gdb)
看不懂到底是什么問題。。。!
2、屏蔽sys線程中的相關的system函數(shù)。(例如檢測flash的/tmp/tmpFlashInfo.file用手工創(chuàng)建好后不再刪除),7個線程一直運行,正常。
3、由1、2的測試得出在system調用的時候使得程序崩潰(gdb調試core文件說是信號11->段錯誤,但是程序中信號都捕捉不到。。)
4、將sys線程獨立為一個單線程運行,正常。由此推出單線程中system函數(shù)應用正常。
5、由3、4推出多線程下system函數(shù)應用是不可靠的。
注:sys線程與其他6六個線程沒有任何交互。
多線程中不能使用這個system函數(shù),這該如何是好啊(例如程序中啟動udhcpd服務等),高手指點下,不甚感激!!
|
呵呵,前面沒有仔細看你的帖子。這次仔細看了一遍。
從理論上來說,多線程中使用system應該沒有什么問題(在不考慮信號的情況下)。
我印象中,我在多線程的程序中使用過system掉用的。只是頻率沒有你這么快。
1、你每秒調用幾次system()是怎么實現(xiàn)的?通過信號還是直接用sleep(1)?
2、試著將調用的頻率降低到每10秒調用一次,看看結果如何?
PS:初步懷疑是system系統(tǒng)調用對信號的處理造成了程序的崩潰。
|
剛看到,system其實就是fork+exec的過程
看你core的跟蹤,信號11是SIGSEGV
一般SIGSEGV是試圖對只讀映射區(qū)域進行寫操作
建議:在你system調用里面寫個別的語句,比如ls?-l?/usr/include?>?/tmp/ls.log之類的
看看是否還core掉
如果不再core,那是你執(zhí)行語句產生的信號問題
就要考慮執(zhí)行語句的處理問題了
如果還core的話,就看看system調用是否對你線程的某信號產生矛盾操作之類的吧
|
多線程程序調用system沒什么問題吧。
我的疑問是,樓主為什么捕捉不到SIGSEG的信號。你是怎么捕捉的?
|
那你試試?PTHREAD_MUTEX_RECURSIVE?類型
|
再寫一個服務程序,專門處理system()調用
你的多線程程序通過某種IPC機制與服務程序通信,指示它調用system(),并返回處理結果
|
我在ARM7上多線程讀寫文件,每個線程讀寫各自的文件(沒看到這句的就不要回復了!)程序發(fā)生不定時的kill。簡化到只開關各自文件不讀寫,問題復現(xiàn)。最后對各線程在打開、關閉文件時用mutex互斥,程序穩(wěn)定運行12小時。
最后總結為IO函數(shù)的不可重入性導致A釋放B的文件指針。
總結
以上是生活随笔為你收集整理的linux运行多线程语句,linux多线程中使用system函数后时而程序崩溃,求助!!!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D设置天空盒skybox
- 下一篇: icem搅拌器网格划分_搅拌器研究所的第