⑴ system函數阻塞怎麼辦
這是進程間同步的問題。解決方法是:fork一個子進程執行system調用,父進程調用 wait 或 waitpid 等待子進程的終止信息。
父進程調用 wait 或 waitpid 時可能會:
? 阻塞(如果它的所有子進程都還在運行)。
? 帶子進程的終止信息立即返回(如果一個子進程已終止,正等待父進程讀取其終止信息)。
? 出錯立即返回(如果它沒有任何子進程)。
wait 和 waitpid 這兩個函數的區別是:
? 如果父進程的所有子進程都還在運行,調用wait將使父進程阻塞,而調用waitpid時如果在options參數中指定WNOHANG可以使父進程不阻塞而立即返回0。
? wait等待第一個終止的子進程,而waitpid可以通過pid參數指定等待哪一個子進程。
⑵ 關於linux用戶級線程阻塞的問題
用戶級實現線程時,內核調度是以進程為單位的,內核並不知道用戶級線程的存在,因此某個用戶級線程的阻塞即會引起整個進程的阻塞。
內核級線程阻塞時,內核完全可以調度同進程內的其它線程運行,也就是沒有阻塞整個線程
⑶ linux下system()調用失敗,返回32512,但有程序執行結果有時成功有時失敗
調用xfs_admin時沒有指明所在路徑,建議使用絕對路徑。
可以在system調用前查詢下當前所在目錄,看是不是xfs_admin程序所在路徑。
#include<unistd.h>
char*getcwd(char*buf,size_tsize);
關於返回值32512,解釋如下:
As for the exit code,
Bits 15-8 = Exit code.
Bit 7 = 1 if a core mp was proced.
Bits 6-0 = Signal number that killed the process.
32512 = 0x7F00
So it didn't die from a signal, a core mp wasn't proced, and it exited with code 255.
What 255 means is unclear, which is why it should accompanied by an error message.
⑷ 如何linux 程序中啟用其他進程,非阻塞,非popen
在Linux程序中啟動其他進程可以用system函數,這個函數會等待它啟動的那個程序結束才返回,所以它是一個阻塞調用。還有一種非阻塞的啟動外部程序的方法,稍微復雜一點,是運用Linux的exec系列函數,之所以說系列函數是因為有不同的變種,只是參數的形式不同而已,其實完全是一樣的,exec系列函數的行為是將當前進程替換成要啟動的那個新進程,這里的當前進程就是你編寫的程序,新進程啟動後調用exec函數的進程就不存在了,exec系列函數調用之後的代碼也不會再執行了。所以,exec系列函數的正確使用方法是在程序中進行fork調用復制進程,然後把exec函數的調用語句放在fork的子進程裡面,注意子進程中exec函數調用的後面就不要寫其他功能的代碼了,因為exec函數後面的語句不會被執行。
⑸ 怎麼調用system函數,使用Android的linux命令
先來看一下system()函數的簡單介紹:
2 int system(const char *command);
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
system()函數調用/bin/sh來執行參數指定的命令,/bin/sh 一般是一個軟連接,指向某個具體的shell,比如bash,-c選項是告訴shell從字元串command中讀取命令;
在該command執行期間,SIGCHLD是被阻塞的,好比在說:hi,內核,這會不要給我送SIGCHLD信號,等我忙完再說;
在該command執行期間,SIGINT和SIGQUIT是被忽略的,意思是進程收到這兩個信號後沒有任何動作。
再來看一下system()函數返回值:
The value returned is -1 on error (e.g. fork(2) failed), and the return status of the command otherwise. This latter return status is in the format specified in wait(2). Thus, the exit code of the command will be WEXITSTATUS(status). In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127).
If the value of command is NULL, system() returns nonzero if the shell is available, and zero if not.
為了更好的理解system()函數返回值,需要了解其執行過程,實際上system()函數執行了三步操作:
1.fork一個子進程;
2.在子進程中調用exec函數去執行command;
3.在父進程中調用wait去等待子進程結束。
對於fork失敗,system()函數返回-1。
如果exec執行成功,也即command順利執行完畢,則返回command通過exit或return返回的值。
(注意,command順利執行不代表執行成功,比如command:」rm debuglog.txt」,不管文件存不存在該command都順利執行了)
如果exec執行失敗,也即command沒有順利執行,比如被信號中斷,或者command命令根本不存在,system()函數返回127.
如果command為NULL,則system()函數返回非0值,一般為1.
popen和system都可以執行外部命令。
popen相當於是先創建一個管道,fork,關閉管道的一端,執行exec,返回一個標準的io文件指針。
system相當於是先後調用了fork, exec,waitpid來執行外部命令
popen本身是不阻塞的,要通過標准io的讀取使它阻塞
system本身就是阻塞的。
⑹ system是阻塞調用嗎
不是。
system(命令);命令發出後 它產生一個 新的線程;是否 阻塞,取決於 這個新線程 自己 的安排。
例如,命令 用了:
START /WAIT 程序.exe 位置參數們
這個命令,設了 等待進程結束,它 能產生 阻塞。
若用 程序.exe 位置參數們 就不會產生 阻塞。
⑺ UNIX中system函數的實現為什麼要阻塞SIGCHLD信號
由於system函數的實現基本原理是使用fork函數創建一個子進程,用子進程調用exec函數,之後將子進程運行的內容替換成了目標程序。如果不阻塞SIGCHLD信號,那麼如果在調用system函數之前還創建了一個其它的子進程,那麼當system函數中fork創建的子進程結束後會給父進程發送SIGCHLD信號,如果此時父進程設置的信號處理方式是捕捉而且在信號處理函數中調用了wait函數,那麼system函數就無法根據其函數中創建的子進程返回狀態獲取相應的返回值。記得有這樣的規定,system函數的返回應該是函數中創建子進程的返回狀態。所以為了能保證system能夠正確獲取system函數中創建的子進程返回狀態,SIGCHLD信號必須被阻塞。
同樣,為了保證system函數不出現其它的一些問題,要求system函數要忽略SIGINT和SIGQUIT信號,如果system函數調用的程序是互動式的,如「ed」,就可能出現一些小問題。
⑻ linux shell 命名管道被阻塞
並不像你想像的那樣(son一直讀取fifo), son 只會讀取一次 fifo 文件就結束了。由於father1第二次寫的時候沒有讀取者,所以你的寫fifo的函數就會被block。 把son 改成
function son (){
while true
do
read line <$pipe
echo from pipe:$LINE
done
}
即可,當然,你可以考慮在 son 中加上判斷結束的條件,比如從fifo中讀到特定字元串就退出循環等。這里不再贅述。
⑼ linux系統c語言進程不想被sleep阻塞等待怎麼解決
1、啟動後檯子任務,在執行命令後加&操作符,表示將命令放在子shell中非同步執行。可以達到多線程效果。如下,sleep10#等待10秒,再繼續下一操作sleep10當前shell不等待,後檯子shell等待。
2、wait命令wait是用來阻塞當前進程的執行,直至指定的子進程執行結束後,才繼續執行。使用wait可以在bash腳本「多進程」執行模式下,起到一些特殊控制的作用。