如題
解析:這道題的1,3問比較簡單,就不多做介紹,主要是第2問。拿到這道題後我立馬就想到了可以用程序間通訊解決,回憶了一下,感覺明明學過,但是不知從何下手,因此,第一版**用的時間差來控制程序的寫入。
**如下
#include#include#include#include#include#include#include#includeint get_second()3個程序啟動後,讓p2程序先睡眠一秒,以保證p1程序先寫入。p1程序僅在奇數秒寫入,p2程序僅在偶數秒寫入,兩個程序交替寫共至少需要20秒。(著實很蠢的辦法)int init()
fclose(fd1);
fd1 = fopen("c.cfg", "w");
if(fd1 == null)
fputs("helloworld", fd1);
fclose(fd1);
fd2 = fopen("b.cfg", "w");
if(fd2 == null)
fputs("0123456789", fd2);
fclose(fd2);
}int fgets(const char *file, char *str)
fgets(str, 11, fd1);
fclose(fd1);
}int write(int i, char *p)
fputc(p[i], fd1);
fclose(fd1);
}int main()
; char *ar = ;
init();//ques1
pid1 = fork();
if(pid1 == 0)//ques2
sleep(1);
} exit(0);
} else
sleep(1);
}} else
}if(pid2 == 0)//ques3
exit(0);
}
接著回去再看了看管道通訊的部分,考慮使用兩個無名管道進行相互通知自己已經寫到a檔案結束,這樣就不用休眠,大大降低程式的執行時間。
#include#include#include#include#include#include#include#includeint init()這版的時間不到1秒,效率增加接近2000%fclose(fd1);
fd1 = fopen("c.cfg", "w");
if(fd1 == null)
fputs("helloworld", fd1);
fclose(fd1);
fd2 = fopen("b.cfg", "w");
if(fd2 == null)
fputs("0123456789", fd2);
fclose(fd2);
}int read_from_pipe(int fd)
; if(read(fd, message, 100) > 0)
else
return 0;
}int write_to_pipe(int fd)
return 1;
}int fgets(const char *file, char *str)
fgets(str, 11, fd1);
fclose(fd1);
}int write(int i, char *p)
fputc(p[i], fd1);
fclose(fd1);
}int main()
; char *ar = ;
init();
if(pipe(fd) || pipe(fd1))
pid1 = fork();
if(pid1 == 0)
while(i<10 && read_from_pipe(fd1[0]));
exit(0);
} else
}else
}if(pid2 == 0)
exit(0);
}
程序及程序控制
學習程序之前,先了解一下程式 所謂程式就是指編譯好的二進位制檔案,在磁碟上,不占用系統資源 cpu 記憶體.而程序是與作業系統相關,是指在記憶體中執行起來的程式,占用一些系統資源,每當乙個程式執行,就相應產生乙個程序。程序的一些相關資訊被放在乙個叫程序控制塊的資料結構中,稱之為pcb。linux下的...
Unix 程序控制
一 程序 程序id為1是init程序,在自舉過程結束時由核心呼叫。程序id為2是頁精靈程序,此程序負責支援虛存系統的請頁操作。也是核心程序。二 fork 對於父程序已經終止的所有程序,它們的父程序都改變為init程序,我們稱這些程序由init程序領養。此保證了每個程序有乙個父程序。init被編寫成只...
程序控制塊
程序控制塊 pcb 的結構 程序控制塊 pcb process control block 存放程序的管理和控制資訊的資料結構稱為程序控制塊。它是程序管理和控制的最重要的資料結構,每乙個程序均有乙個pcb,在建立程序時,建立pcb,伴隨程序執行的全過程,直到程序撤消而撤消。在不同的作業系統中對程序的...