首先,,該程序運(yùn)行,需要很大的數(shù)據(jù),,需要很大內(nèi)存,。在測(cè)試小數(shù)據(jù)的時(shí)候,程序沒有任何問題,,在運(yùn)行測(cè)試大數(shù)據(jù)的時(shí)候,,出現(xiàn)問題。個(gè)人認(rèn)為程序本身編程代碼應(yīng)該沒有問題,。 通過程序錯(cuò)誤定位,,定位到了system命令,。system命令調(diào)用,程序根本沒有反應(yīng),。完全將system命令忽略,。
=========================
每個(gè)命令都有返回值,重新試過,,發(fā)現(xiàn)調(diào)用system命令的返回值都是-1. cerr<<"before pdflatex"<<endl;
=========================
研究system命令,。為何返回-1? system()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,,由子進(jìn)程來調(diào)用/bin/sh-c string來執(zhí)行參數(shù)string字符串所代表的命令,,此命>令執(zhí)行完后隨即返回原調(diào)用的進(jìn)程。在調(diào)用system()期間SIGCHLD 信號(hào)會(huì)被暫時(shí)擱置,,SIGINT和SIGQUIT 信號(hào)則會(huì)被忽略,。 返回值: 如果fork()失敗 返回-1:出現(xiàn)錯(cuò)誤 如果exec()失敗,表示不能執(zhí)行Shell,返回值相當(dāng)于Shell執(zhí)行了exit(127) 如果執(zhí)行成功則返回子Shell的終止?fàn)顟B(tài) 如果system()在調(diào)用/bin/sh時(shí)失敗則返回127,,其他失敗原因返回-1,。若參數(shù)string為空指針(NULL),則返回非零值>,。如果system()調(diào)用成功則最后會(huì)返回執(zhí)行shell命令后的返回值,,但是此返回值也有可能為 system()調(diào)用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認(rèn)執(zhí)行成功,。
=====================================
那么,,將錯(cuò)誤定位為fork()失敗。 下面是fork(): fork調(diào)用的一個(gè)奇妙之處就是它僅僅被調(diào)用一次,,卻能夠返回兩次,,它可能有三種不同的返回值: 在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID,; 在子進(jìn)程中,,fork返回0; 如果出現(xiàn)錯(cuò)誤,,fork返回一個(gè)負(fù)值,; fork出錯(cuò)可能有兩種原因: (1)當(dāng)前的進(jìn)程數(shù)已經(jīng)達(dá)到了系統(tǒng)規(guī)定的上限,這時(shí)errno的值被設(shè)置為EAGAIN,。 (2)系統(tǒng)內(nèi)存不足,,這時(shí)errno的值被設(shè)置為ENOMEM。(關(guān)于errno的意義,,請(qǐng)參考本系列的第一篇文章,。) fork系統(tǒng)調(diào)用出錯(cuò)的可能性很小,而且如果出錯(cuò),,一般都為第一種錯(cuò)誤,。如果出現(xiàn)第二種錯(cuò)誤,,說明系統(tǒng)已經(jīng)沒有可分配的內(nèi)存,正處于崩潰的邊緣,,這種情況對(duì)Linux來說是很罕見的,。
============================
下面想到的就是查看errno的內(nèi)容。 當(dāng)linux中的C api函數(shù)發(fā)生異常時(shí),一般會(huì)將errno變量(需include errno.h)賦一個(gè)整數(shù)值,不同的值表示不同的含義,可以通過查看該值推測(cè)出錯(cuò)的原因,,在實(shí)際編程中用這一招解決了不少原本看來莫名其妙的問題。但是 errno是一個(gè)數(shù)字,,代表的具體含義還要到errno.h中去閱讀宏定義,,而每次查閱是一件很繁瑣的事情。有下面幾種方法可以方便的得到錯(cuò)誤信息
|
|