?? fifo交互流程.txt
字號(hào):
1. cgi進(jìn)程與主進(jìn)程之間的交互
各cgi進(jìn)程與主進(jìn)程通過(guò)fifo方式進(jìn)行進(jìn)程間交互。
主進(jìn)程在啟動(dòng)時(shí)首先建立一個(gè)讀fifo,文件名為"/tmp/cgi_to_main",代碼如下:
/**********************************************************************************************
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define CGI_TO_MAIN_FIFO "/tmp/cgi_to_main"
//建立fifo
if((mkfifo(CGI_TO_MAIN_FIFO, O_CREAT|O_EXCL)<0) && (errno!=EEXIST))
printf("cannot create CGI_TO_MAIN_FIFO\n");
//打開(kāi)fifo,此fd可以用select進(jìn)行處理,用read來(lái)讀取fifo中的數(shù)據(jù)
fd = open(CGI_TO_MAIN_FIFO, O_RDONLY|O_NONBLOCK,0);
if(fd==-1)
{
printf("open read error\n");
exit();
}
//讀取fifo中的數(shù)據(jù), r_size是一個(gè)預(yù)設(shè)值,建議為4096,ret_size為發(fā)送進(jìn)程實(shí)際發(fā)送的值(只要該值小于4096,可以
//一次讀到, 不會(huì)產(chǎn)生多個(gè)進(jìn)程發(fā)送過(guò)來(lái)數(shù)據(jù)的串?dāng)_)
ret_size = read(fd, r_buf, r_size);
//關(guān)閉及刪除fifo
unlink(CGI_TO_MAIN_FIFO);
***********************************************************************************************/
cgi進(jìn)程直接讀 系統(tǒng)配置文件,來(lái)顯示當(dāng)前的系統(tǒng)參數(shù)。 (系統(tǒng)文件的文件名和路徑是什么?)
cgi進(jìn)程在需要配置參數(shù)時(shí),首先將要配置的參數(shù)存入臨時(shí)配置文件(見(jiàn)2), 然后將pid以字符串的形式通過(guò)寫(xiě)fifo
發(fā)送給主進(jìn)程。 主進(jìn)程設(shè)置完畢后,將結(jié)果存入 系統(tǒng)配置文件 中,然后發(fā)送結(jié)果給cgi進(jìn)程(通過(guò)cgi進(jìn)程建立的fifo,
fifo的名稱為/tmp/fifoXXX(XXX為cgi進(jìn)程的pid))。 如果成功,返回字符串“1”,否則返回字符串“0”。寫(xiě)fifo的代碼如下:
/**********************************************************************************************
w_fd = open("/tmp/fifoXXX", O_WRONLY|O_NONBLOCK, 0); //寫(xiě)時(shí)只需open,無(wú)需mkfifo及unlink(這些由read方完成)
if(w_fd == -1)
if(errno == ENXIO)
printf("open error; no reading process\n");
real_wnum = write(w_fd, w_buf, len); //len為w_buf的長(zhǎng)度,不要超過(guò)4096
//write完, close(w_fd)即可
***********************************************************************************************/
而當(dāng)cgi進(jìn)程要控制云臺(tái),無(wú)需修改配置文件時(shí),直接通過(guò)fifo發(fā)送命令給主進(jìn)程,命令格式為:
0 cmd pid
其中cmd為特定的cmd,如下:
云臺(tái)左: 100
云臺(tái)右: 101
云臺(tái)上: 102
云臺(tái)下: 103
云臺(tái)居中: 104
云臺(tái)左右巡航:105 //這兩個(gè)命令對(duì)于主程序翻轉(zhuǎn)其開(kāi)/關(guān)狀態(tài)即可,默認(rèn)為關(guān)
云臺(tái)上下巡航:106
恢復(fù)出廠設(shè)置:107
加入pid是為了以防萬(wàn)一,留作擴(kuò)展?
2. 臨時(shí)配置文件名為/tmp/changeXXX, XXX為相應(yīng)cgi進(jìn)程的pid, 原來(lái)文檔里定為(.cfg), 我覺(jué)得.cfg有點(diǎn)多余,還增加了一個(gè)strcat的操作,最好就不要了?
臨時(shí)文件里的格式為:
LEN
NO=DATA
...
NO=DATA
其中,LEN始終在第一行,為這個(gè)臨時(shí)文件中一共要配置的參數(shù)個(gè)數(shù),
NO為參數(shù)的編號(hào)(對(duì)應(yīng)于“配置參數(shù)列表v0(1).976-20070804.xls”), NO編號(hào)從 1 開(kāi)始,
DATA為實(shí)際的值,NO和DATA均以字符串形式給出。
"="左右都沒(méi)有空格,直接和NO,DATA相連。
每一項(xiàng)NO=DATA占一行。
q1. 系統(tǒng)文件的文件名和路徑是什么? /etc/cfg/config.ini
q2. 是否在cmd中加入pid? 是, 格式為0 cmd pid\n
q3. 臨時(shí)配置文件名? 就按上面的來(lái)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -