linux web高级编程,寒假学习 第16.17天 (linux 高级编程)
寒假學(xué)習(xí) 第16.17天 (linux 高級(jí)編程) 筆記 總結(jié)
一、進(jìn)程的基本控制(進(jìn)程的同步)
1.進(jìn)程的常見(jiàn)控制函數(shù)
pause ? sleep/usleep
atexit ? on_exit
int atexit(void (*function)(void)); ? ?//注冊(cè)終止函數(shù)(即main執(zhí)行結(jié)束后調(diào)用的函數(shù))
int on_exit(void (*function)(int , void *), void *arg); //跟atexit差不多,只不過(guò)函數(shù)可以帶參數(shù)
#include
#include
#include
void fun()
{
printf("over!\n");
}
int main(int argc, const char *argv[])
{
atexit(fun); //注冊(cè),
printf("Processs!\n");
return 0;
}
2.進(jìn)程與文件鎖(鎖有共享鎖跟強(qiáng)制鎖,內(nèi)核編譯不同)
多進(jìn)程下面文件的讀寫(xiě)是共享的。
怎么知道一個(gè)文件正在被另外進(jìn)程讀寫(xiě)?
就是要使用文件鎖。
API:
fcntl (文件鎖受內(nèi)核參數(shù)影響)
對(duì)文件加鎖
int fcntl(int fd, int cmd, ... /* arg */ );
返回0加鎖成功,-1加鎖失敗。
fd 加鎖的文件符號(hào)
cmd 鎖的操作方式 F_SETLK(如果已經(jīng)加鎖就異常返回) ?F_UNLK ?F_SETLCKW(已經(jīng)加鎖,者、則阻塞等待等到解鎖)
... struct flock* 類(lèi)型
struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(F_GETLK only) */
...
};
例子:
setlock.c
#include
#include
#include
#include
int main(int argc, const char *argv[])
{
int fd;
struct flock lk;
int r;
fd=open("test.txt",O_RDWR);
if(fd==-1) printf("error:%m\n"),exit(-1);
lk.l_type=F_WRLCK;
lk.l_whence=SEEK_SET;
lk.l_start=5;
lk.l_len=10;
r=fcntl(fd,F_SETLK,&lk);
if(r==0)
printf("加鎖成功!\n");
else
printf("加鎖失敗!\n");
while(1);
return 0;
}
getlock.c
#include
#include
#include
#include
int main(int argc, const char *argv[])
{
int fd;
struct flock lk={0}; //一定要初始化0
int r;
fd=open("test.txt",O_RDWR);
if(fd==-1) printf("error:%m\n"),exit(-1);
r=fcntl(fd,F_GETLK,&lk);
if(lk.l_type=F_WRLCK){
printf("寫(xiě)鎖!\n");
}
printf("pid:%d,start:%d, len:%d\n",r,lk.l_pid,lk.l_start,lk.l_len);
return 0;
}
鎖也是一個(gè)進(jìn)程可以共享的信息
二、信號(hào)
1.信號(hào)的作用
流程:
信號(hào)發(fā)給操作系統(tǒng),操作系統(tǒng)查找這個(gè)信號(hào)是否注冊(cè),如果注冊(cè)系統(tǒng)就調(diào)用函數(shù)
沒(méi)有注冊(cè)則采用缺省處理(一般是調(diào)用打印信號(hào)提示,并終止程序)
為了解決進(jìn)程之間通信難。
作用:通知其他進(jìn)程響應(yīng)。(其實(shí)就是進(jìn)程之間一種通信機(jī)制)
一般接受信號(hào)的進(jìn)程會(huì)馬上停止(軟中斷),并且調(diào)用信號(hào)的處理函數(shù)(默認(rèn)的處理函數(shù),或者用戶(hù)的處理函數(shù))。
例子:
2.信號(hào)的發(fā)送與安裝
kill ? -s ?信號(hào) ?進(jìn)程ID ? ? ? ? //向指定的進(jìn)程發(fā)送信號(hào)
kill -l ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//可以看所有的信號(hào) ?ctrl+D 就相當(dāng)于發(fā)送信號(hào)2(即SIGINT)
例子:
#include
#include
#include
void handle(int s)
{
printf("信息發(fā)生\n");
}
int main(int argc, const char *argv[])
{
signal(SIGINT,handle); //注冊(cè)信號(hào)
while(1)
{
printf("進(jìn)程在執(zhí)行!\n");
sleep(1);
}
return 0;
}當(dāng)kill -s 2 pid 時(shí)(或直接ctrl+C)就會(huì)輸出 ? “信號(hào)發(fā)送”
其中?SIGKILL與?SIGSTOP信號(hào)是不能被處理的
int kill(pid_t pid, int sig); ?//發(fā)送信號(hào)
pid:如果>0 ?發(fā)送到指定進(jìn)程
如果=0 ?發(fā)送信號(hào)到該進(jìn)程所在進(jìn)程組的所有進(jìn)程
如果=-1 發(fā)送給除init (1)之外的所有進(jìn)程
如果<0 ? 發(fā)送給指定的進(jìn)程組(組ID就是 它的絕對(duì)值)
例子:
#include
#include
#include
int main(int argc, const char *argv[])
{
while(1)
{
kill(4184,SIGINT);
sleep(2);
}
return 0;
}
3.信號(hào)的應(yīng)用(實(shí)現(xiàn)多任務(wù))
延時(shí)器 timeout
信號(hào):SIGALRM
信號(hào)發(fā)送函數(shù):unsigned int alarm(unsigned int seconds); //自向本進(jìn)程發(fā)出
例子:
#include
#include
void deal(int s)
{
printf("起床!\n");
}
int main(int argc, const char *argv[])
{
signal(SIGALRM,deal);
alarm(5);
while(1)
{
printf("AAAAA\n");
sleep(1);
}
return 0;
}
定時(shí)器
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, //計(jì)時(shí)方式 ?ITIMER_REAL真實(shí)時(shí)間 ?ITIMER_VIRTUAL程序暫用cpu的時(shí)間 ??ITIMER_PROF 進(jìn)程跟系統(tǒng)的混合時(shí)間
const struct itimerval *new_value, ?//定時(shí)器的時(shí)間參數(shù)
struct itimerval *old_value); ? //返回原來(lái)設(shè)置的定時(shí)器,如果NULL 者不返回。
(set interval timter)
struct itimerval {
struct timeval it_interval;// 延時(shí)時(shí)間
struct timeval it_value; ? //間隔時(shí)間
};
struct timeval {
time_t ? ? ?tv_sec; ? ? ? ? ? ?//秒
suseconds_t tv_usec; ? //毫秒
};
例子:
#include
#include
#include
void deal(int s)
{
printf("起床!\n");
}
int main(int argc, const char *argv[])
{
struct itimerval val={0};
signal(SIGALRM,deal);
val.it_value.tv_sec=3; //sec跟usec都為0的表無(wú)窮時(shí)間,不會(huì)觸發(fā)
val.it_interval.tv_sec=1;
setitimer(ITIMER_REAL,&val,0);
while(1)
{
printf("AAAAA\n");
sleep(1);
}
return 0;
}3秒鐘過(guò)后每隔1秒鐘顯示 “起床了”。
http://www.dengb.com/ASPjc/729417.htmlwww.dengb.comtruehttp://www.dengb.com/ASPjc/729417.htmlTechArticle寒假學(xué)習(xí) 第16.17天 (linux 高級(jí)編程) 筆記 總結(jié) 一、進(jìn)程的基本控制(進(jìn)程的同步) 1.進(jìn)程的常見(jiàn)控制函數(shù) pause sleep/usleep atexit on_exit int...
總結(jié)
以上是生活随笔為你收集整理的linux web高级编程,寒假学习 第16.17天 (linux 高级编程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux dev controlC0,
- 下一篇: 唯美的个性签名简短的