實驗參考:
linux
系統呼叫
1.
程序控制的系統呼叫
l fork系統呼叫建立新的子程序
格式: pid=int fork()
fork呼叫返回時,系統中已有兩個使用者級環境完全相同的程序存在,這兩個
程序從fork呼叫中得到的返回值不同,其中子程序得到的返回值為零,父程序
得到的返回值是新建立子程序的程序標識號。
l exec系統呼叫
格式:(六種)
int execl(path,arg0,arg1,…,argn,(char *)0)
char *path, *arg0, *arg1, …, *argn ;
exec呼叫程序的正文段被指定的目標檔案的正文段所覆蓋,其屬性的變化方
式與fork成功後從父程序那裡繼承屬性的方式幾乎是一樣的。系統中絕大多數
命令都是通過exec來執行的,不但shell程序所建立的子程序使用它來執行使用者
命令,shell程序本身和它的祖先程序也是用exec來啟動執行的。
l exit 系統呼叫終止程序執行
格式:void exit(status)
int status ;
引數status是呼叫程序終止時傳遞給其父程序的值。如呼叫程序還有子進
程,則將其所有子程序的父程序改為1號程序。
l wait 系統呼叫等待子程序暫仃或終止
格式:int wait(stat_loc) int wait((int *)0)
int stat_loc ;
wait 呼叫將呼叫程序掛起,直到該程序收到乙個被其捕獲的訊號或者它的任
何乙個子程序暫仃或終止為止。如果wait 呼叫之前已有子程序暫仃或終止,則
該呼叫立即返回。
l lockf 鎖定檔案
格式:int lockf(fd,fuction,size)
int files, fuction; long size; fd – 鎖定檔案標識
function=0不鎖定表示
=1鎖定
=2測試和鎖定
=3測試有否被鎖定
size --鎖定或解鎖的位元組數,0表示從檔案的當前位置到檔案尾。
l程式例項:
#include
void main(intargc, char *argv[ ])
else if (pid==0) /* childprocess */
else /*parentprocess */
}2.
程序通訊的管道方式
l pipe系統呼叫
格式: intpipe (filedes)
int filedes [2];
l程式例項:管道通訊
#include
#include
char parent=;
char child=;
main()
else
3.
程序通訊的訊息佇列方式
訊息佇列就是訊息的乙個鍊錶,它允許乙個或多個程序向它寫訊息,乙個或多個程序從中讀訊息。具有一定的fifo的特性,但是可實現訊息的隨即查詢。這些訊息存在於核心中,由「佇列id」來標識。
訊息佇列的實現包括建立和開啟佇列、新增訊息、讀取訊息和控制訊息佇列這四種操作。
msgget:建立和開啟佇列,其訊息數量受系統限制。
msgsnd:新增訊息,將訊息新增到訊息佇列尾部。
msgrcv:讀取訊息,從訊息佇列中取走訊息。
msgctl:控制訊息佇列。
int msgget (key_tkey, int flag)
key:返回新的或已有佇列的id,ipc_private
int msgsnd (intmsqid, struct msgbuf *msgp, size_t msgsz, int flag)
其中:msqid是訊息佇列的佇列id;msgp是訊息內容所在的緩衝區;msgsz是訊息的大小;msg***是標誌,ipc_nowait若訊息並沒有立即傳送而呼叫程序會立即返回。
int msgrcv (intmsqid, struct msgbuf *msgp, size_t msgsz,long msgtyp, int flag)
msqid是訊息佇列的引用識別符號;msgp是接收到的訊息將要存放的緩衝區;msgsz是訊息的大小;msgtyp是期望接收的訊息型別;
int msgctl (intmsqid, int cmd, struct msqid_ds *buf)
msqid是訊息佇列的引用識別符號;cmd是執行命令;buf是乙個緩衝區。cmd引數指定對於由msqid規定的佇列要執行的命令:ipc_stat 取此佇列的msqid_ds結構,並將其存放在buf指向的結構中。ipc_set 按由buf指向的結構中的值,設定與此佇列相關的結構中的下列四個字段:msg_perm.uid、msg_perm.gid、msg_perm;mode和msg_qbytes。此命令只能由下列兩種程序執行:一種是其有效使用者id等於msg_perm.cuid或msg_perm.uid;另一種是具有超級使用者特權的程序。只有超級使用者才能增加msg_qbytes的值。
ipc_rmid 從系統中刪除該訊息佇列以及仍在該佇列上的所有資料。這種刪除立即生效。仍在使用這一訊息佇列的其他程序在它們下一次試圖對此佇列進行操作時,將出錯返回 eidrm。
此命令只能由下列兩種程序執行:一種是其有效使用者id等於msg_perm.cuid或msg_perm.uid;另一種是具有超級使用者特權的程序。msg***是標誌。
程式例項:
1)mesg_que_send.c
intmain()
wmsg;
key=ftok("/home/yandongsheng/",10);
pid=getpid();//獲得傳送程序的id
if((msgkey=msgget(key,ipc_creat|0660))<0)
printf("msgget key %d\n",msgkey);
fflush(stdout);
while(1)
sleep(2);
}if((msgctl(msgkey,ipc_rmid,null))<0)
return0;
}2)mesg_que_recv.c
intmain()
rmsg;//訊息的格式應該是一樣的
pid=getpid();
key=ftok("/home/yandongsheng/",10);
while(1)
printf("rmsg.from=%d\nmy pidis:",rmsg.from,pid);
printf("rmsg.mtype=%d\nrmsg.count=%d\nrmsg.mtext=%s\n",rmsg.mtype,rmsg.count,rmsg.mtext);
sleep(2);
}if((msgctl(msgkey,ipc_rmid,null))<0)
return0;
}先執行mesg_que_send.c 後執行mesg_que_recv.c 僅做演示
Linux系統管道間通訊
引子 在linux系統的終端上輸入ps aux grep bash,會在終端上輸出 lapvir ubuntu ps aux grep bash lapvir 3330 0.0 0.2 29568 5060 pts 0 ss 15 47 0 00 bin bash lapvir 3507 0.0 0...
Linux 管道通訊
一 定義 管道是單向的 先進先出的。它將乙個程式的輸入和另乙個程式的輸出連線起來。資料被乙個程序讀出後,將被從管道中刪除。分為無名和有名管道兩種。前者用於父程序和子程序間的通訊,後者用於同一系統的兩個程序間通訊。二 無名管道 int pipe int fd 2 其中,fd 0 用於讀管道,fd 1 ...
Linux管道通訊
現在在linux 中使用較多的程序間通訊方式主要有以下幾種。1 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。2 訊號 signal 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊...