日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

UNIX進程之間的通信

【UNIX進程之間的通信】
Unix進程之間的通信

進程通訊是unix中很重要的知識 。產(chǎn)生一個新的進程主要有以下3種方法:

1,fork調(diào)用;

2,System調(diào)用;

3,Exec調(diào)用;

我們常說的進程通訊編程主要有以下3種方法:

1,Message queue隊列編程;

2,Tcp/IP socket編程;

3,共享內(nèi)存編程;

一、進程調(diào)用

1,產(chǎn)生進程Fork調(diào)用例子:

fork()

功能:創(chuàng)建一個新的進程.
語法:#include
#include
pid_t fork();
說明:本系統(tǒng)調(diào)用產(chǎn)生一個新的進程, 叫子進程, 是調(diào)用進程的一個復制品. 調(diào)用進程叫父進程, 子進程繼承了父進程的幾乎所有的屬性:
. 實際UID,GID和有效UID,GID.
. 環(huán)境變量.
. 附加GID.
. 調(diào)用exec()時的關(guān)閉標志.
. UID設(shè)置模式比特位.
. GID設(shè)置模式比特位.
. 進程組號.
. 會話ID.
. 控制終端.
. 當前工作目錄.
. 根目錄.
. 文件創(chuàng)建掩碼UMASK.
. 文件長度限制ULIMIT.
. 預(yù)定值, 如優(yōu)先級和任何其他的進程預(yù)定參數(shù), 根據(jù)種類不同決定是否可以繼承.
. 還有一些其它屬性.


但子進程也有與父進程不同的屬性:
. 進程號, 子進程號不同與任何一個活動的進程組號.
. 父進程號.
. 子進程繼承父進程的文件描述符或流時, 具有自己的一個拷貝并且與父進程和其它子進程共享該資源.
. 子進程的用戶時間和系統(tǒng)時間被初始化為0.
. 子進程的超時時鐘設(shè)置為0.
. 子進程的信號處理函數(shù)指針組置為空.
. 子進程不繼承父進程的記錄鎖.
返回值: 調(diào)用成功則對子進程返回0, 對父進程返回子進程號, 這也是最方便的區(qū)分父子進程的方法. 若調(diào)用失敗則返回-1給父進程,子進程不生成.

2,產(chǎn)生進程system調(diào)用例子:

功能:產(chǎn)生一個新的進程, 子進程執(zhí)行指定的命令.
語法:#include
#include
int system(string)
char *string;
說明:本調(diào)用將參數(shù)string傳遞給一個命令解釋器(一般為sh)執(zhí)行, 即string被解釋為一條命令, 由sh執(zhí)行該命令.若參數(shù)string為一個空指針則為檢查命令解釋器是否存在.該命令可以同命令行命令相同形式, 但由于命令做為一個參數(shù)放在系統(tǒng)調(diào)用中, 應(yīng)注意編譯時對特殊意義字符的處理. 命令的查找是按PATH環(huán)境變量的定義的. 命令所生成的后果一般不會對父進程造成影響.返回值:當參數(shù)為空指針時, 只有當命令解釋器有效時返回值為非零.若參數(shù)不為空指針, 返回值為該命令的返回狀態(tài)(同waitpid())的返回值. 命令無效或語法錯誤則返回非零值,所執(zhí)行的命令被終止. 其他情況則返回-1.


[code:1:d22bc4f5e9]例子1:char command[81];
int i;
for (i=1;i<8;i) {
sprintf(command,"ps -t ttyi",i);
system(command);
}


例子2:

char befehl[200]; /* string buffer for csh command */
char *runserver = "hosts1"; /* server name */
short shift_act_l; /* currect shift number */
char shift_act_c[1];
char shift_beg[20]; /* shift begin */
char shift_end[20]; /* shift end */
....
T_report_p->shift_no="0";
memcpy(T_report_p->time_from,"yyyy-mm-dd hh:mi:ss",sizeof(T_report_p->time_from));
memcpy(T_report_p->time_to,"yyyy-mm-dd hh:mi:ss",sizeof(T_report_p->time_to));

memset(befehl, "", sizeof(befehl));
sprintf (befehl, "rsh %s %sprot.sh "%s %s %c ".19s" ".19s" "%9.9s" 0" &",
runserver,
REPORT_RSH_PATH,
PROD_LOG,
DRUCKER_NAME_1,
T_report_p->shift_no,
T_report_p->time_from,
T_report_p->time_to,
T_report_p->coil_id );

system (befehl);

3,產(chǎn)生進程exec()調(diào)用例子:


exec()

功能:執(zhí)行一個文件
語法:#include
int execl(path,arg0,...,argn,(char*)0)
char *path,*arg0,...,*argn;

推薦閱讀