作者:張昌昌
在一些情況下,往往需要同時啟動多個終端並讓終端執行自動執行相應的命令,進而達到提高操作效率的目的。在linux下gnome-terminal啟動終端命令,
gnome-terminal -x 後跟執行的命令,bash是linux啟動子shell的命令,bash -c "所要執行的命令串",通過嵌套gnome-terminal -x bash -c ......,表示啟動新終端,
並在新啟動的終端裡執行bash -c,即啟動子shell,由子shell執行-c後面的雙引號括起來的命令串。同時為保證gnome-terminal新啟的終端不退出,要在bash -c的命令串後
加bash讓其有一個進程在運行,本例中加的是erl命令,直接進入erl終端,當然不會退出。
c語言版:
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char * argv[])
{
int count = atoi(argv[1]),i;
for(i=0;i<count;i++)
{
pid_t pid = fork();
if(pid == 0)
{
//printf("child=%d ",getpid());
system("gnome-terminal -x bash -c 'ulimit -n 1000000;cd /home;erl'");
exit(0);
}
}
exit(0);
}
執行 ./a.out 3
該程序采用異步多進程方式,fork子進程,通過system(。。。。)系統調用執行相應的命令,該程序需要注意的是(1)main函數如何帶參數,所帶的參數是從argv[1]開始的,argv[0]默認的參數為“0”,實際上argv數組的長度是外面參數的個數加1;(2)fork出的子進程,照樣會執行for循環,因此為避免此現象發生,fork子進程執行後,exit(0)讓子進程退出,啟動下一個子進程;(3)fork返回值在子進程裡是0,在父進程裡是生成的子進程進程號;(4)c語言的atoi()可以把字符串轉化為整型。
Bash shell版
#!/bin/bash for((i=0;i<$1;i++)) do ((port=2+i)) gnome-terminal -x bash -c "cd /home;ulimit -n 1000000;erl +K true -run io format $port" & done該腳本更加輕量靈活,注意&是切換到後台運行,防止阻塞當前進程的for的下一次執行,由此可知shell也是多進程模型,而js腳本是單進程模型。
轉載注明出處。