- 論壇徽章:
- 0
|
本帖最后由 yizhengming 于 2014-01-04 17:06 編輯
兩個程序通信 采用客服-服務(wù)器形式(system v 消息通信機(jī)制)
問題是:運(yùn)行服務(wù)器程序(sev)和客服程序(cli)后, 然后用kill 殺掉top進(jìn)程,但為什么sev也被殺掉了? 求大蝦解釋 謝謝
服務(wù)器程序(sev):-
- #define MSGKEY 75
- struct msgform {
- long mtype;
- char mtext[256];
- } msg;
- int msgid;
- void cleanup()
- {
- msgctl(msgid, IPC_RMID, 0);
- exit(0);
- }
- void main()
- {
- int i, clipid, chipid, *pint, count;
- count = 0;
- for (i=0; i<20; i++) {
- signal(i, cleanup);
- }
- msgid = msgget(MSGKEY, 0777|IPC_CREAT);
- for (;;) { //無限循環(huán)
- count++;
- msgrcv(msgid, &msg, 256, 1, 0);
- pint = (int *) msg.mtext;
- clipid = *pint;
- printf("server: receive from pid %d\n", clipid);
- if ((chipid = fork()) == 0) {
- execl("/usr/bin/top", "top", "-b", (char *)0);
- }
- msg.mtype = clipid;
- *pint = chipid;
- msgsnd(msgid, &msg, sizeof(msg.mtext), 0);
- }
- }
- 客服程序(cli):
- #define MSGKEY 75
- struct msgform {
- long mtype;
- char mtext[256];
- };
- void main()
- {
- struct msgform msg;
- int msgid, pid, *pint;
- unsigned i;
- msgid = msgget(MSGKEY, 0777);
- pid = getpid();
- pint = (int *) msg.mtext;
- *pint = pid;
- msg.mtype = 1;
- msgsnd(msgid, &msg, sizeof(int), 0);
- for (i=0; i<100000000; i++)
- ;
- msgrcv(msgid, &msg, 256, pid, 0);
- printf("client: receive top pid %d\n", *pint);
- }
復(fù)制代碼 |
|