Java 可以通過 Runtime 調用Linux命令,形式如下:
Runtime.getRuntime().exec(command)
但是這樣執行時沒有任何輸出,因為調用 Runtime.exec
方法將產生一個本地的進程,並返回一個Process子類的實例(注意:Runtime.getRuntime().exec(command)返回的是
一個Process類的實例)該實例可用於控制進程或取得進程的相關信息。
由於調用 Runtime.exec
方法所創建的子進程沒有自己的終端或控制台,因此該子進程的標准IO(如stdin,stdou,stderr)都通過
Process.getOutputStream(),Process.getInputStream(),
Process.getErrorStream() 方法重定向給它的父進程了。
用戶需要用這些stream來向子進程輸入數據或獲取子進程的輸出,下面的代碼可以取到 linux 命令的執行結果:
try {
String[] cmd = new String[]{」/bin/sh」, 「-c」, 」 ls 「};
Process ps = Runtime.getRuntime().exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append(」\n」);
}
String result = sb.toString();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
借鑒於:http://www.linuxidc.com/Linux/2010-07/27376.htm
『貳』 linux 如何獲得正在運行程序的pid
你用了pthread庫,在鏈接的時候要加上
gcc
-lpthread
1.c
-o
1
即可
子進程(對應pid==0語句)調用pthread介面創建線程,在縣城內將value賦值5,然後列印
child:
value=%d\n
此時value
=
5
父進程
(對應
pid
>
0
語句),等待子進程執行完成後(wait語句),列印parent:
value=%d\n
,此時value
=
0
對於你補充問題的回答:
線程是在子進程里創建的,它只改變了子進程的value
(子進程和父進程的value處在不同的地址空間,互相沒有關系,而子進程和它所創建的線程是在同一地址空間,所以線程可以改變子進程的value),
父進程沒有創建線程,因此它的值不會被改變。
『叄』 linux 如何得到一個進程的子進程
調用 fork 函數。
『肆』 Linux中的進程問題,以及exit(0); 和sleep(5);
俺跟你解釋一下:
fork是一個跟當前進程一模一樣的進程,包括當前進程的所有狀態(有特殊設置就不會拷貝,如文件標識)。子進程如果不設置新的執行程序,會繼續執行fork之後的代碼,注意前面提過的跟父進程一模一樣的代碼。
pid==0代表是子進程,因此子進程會執行這段代碼:
if(pid==0)
{
printf("child!!! ");
//這里會造成子進程的主線程,main執行線程,阻塞5秒
sleep(5);
exit(0);
}
pid > 0 代表是父進程,因此父進程繼續執行的代碼為:
if(pid>0)
{
//此處必須等待子進程結束,子進程調用exit(0),時會通知父進程繼續執行
//屬於進程間通訊、同步的一個手段之一。那子進程等待5秒被喚醒,執行exit(0)
//父進程收到通知,獲取到子進程的退出狀態,繼續就會printf,基本也就是等待了5秒
//然後父進程return0等價於exit(0)正常結束
wait(NULL);//不這樣寫,父進程直接結束可能會產生僵屍進程,也可能變成孤兒進程由
//由init進程領養,並正確結束。通用的做法必須wait。根據操作系統以及版本不同處理
//方式可能不一樣,如aix可能就會有僵屍進程產生
printf("father!!! ");
}
『伍』 linux系統中創建子進程的程序,不知道該用getpid()還是getppid()
父進程返回的是是子進程號。他再getppid就成了他父親的了。他這里是要返回他兒子的進程號。他兒子返回的是0,getppid得到他父親的進程號。所以只有在父親這里才可以得到子進程號。
『陸』 Linux中子進程執行exec後,父進程還需要再wait這個子進程嗎
wait子進程是為了當子進程結束後,獲取子進程的相關運行信息和替子進程收屍(也就是清理子進程的PCB),不然子進程會變成僵屍進程,佔用系統空間。exec只是把子進程的代碼段替換掉,其他的段不變。如果父進程先於子進程結束,init進程會變成子進程的父進程,子進程結束後init會負責清理PCB,但是如果父進程晚於子進程結束,並且父進程也沒有wait子進程,那麼子進程結束後,它的PCB既不會被父進程清理也不會被init進程清理,浪費系統資源。
『柒』 Linux中如何在子進程獲取父進程的pid
getppid() 獲取父進程 id,
getpid() 獲取當前進程 id.
比如
int main()
{
int pid = fork();
if (pid == 0)
{
// child
printf ("ParentID is %d\n", getppid());
}
esle
{
printf("I'm parent, id %d\n", getpid());
wait(NULL);
}
return 0;
}
再就是程序編譯沒錯,但是運行時出現「實時信號 2」
沒有源碼,誰也幫不上你。 你可以用 gdb去調試。
『捌』 linux c語言調用shell 怎樣得到該子進程的pid(就是被調用的那個shell的pid)
第一種方法:執行完shell後用$!命令獲得pid
第二種方法:在shell中加入echo $$可以把它的pid輸出
『玖』 請教Linux下面 使用execl 調用一個進程如何獲得這個子進程得ID
execl的man手冊第一句話就說了:The exec() family of functions replaces the current process image with a new process image.你的整個進程空間都已經被替換成新的進程了,哪兒還有下面?下面已經太監了,不會再有了。所有execl之後的代碼都已經無法執行
『拾』 linux中,如何查看某個進程號下面有哪些子進程
ps -lax查看進程,以及父進程。找到自己需要查看的進程的pid,然後
ps --ppid ****