真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

包含Linux的wait命令的詞條

誰來給我講一下linux系統(tǒng)編程里的“wait

linux查看連接數(shù),并發(fā)數(shù)1、查看apache當前并發(fā)訪問數(shù): netstat -an grep ESTABLISHED wc -l對比httpd.conf中MaxClients的數(shù)字差距多少。2、查看有多少個進程數(shù):ps auxgrep httpdwc -l3、可以使用如下參數(shù)查看數(shù)據(jù)server-status?auto#ps -efgrep httpdwc -l1388統(tǒng)計httpd進程數(shù),連個請求會啟動一個進程,使用于Apache服務器。表示Apache能夠處理1388個并發(fā)請求,這個值Apache可根據(jù)負載情況自動調整。#netstat -natgrep -i 80wc -l4341netstat -an會打印系統(tǒng)當前網(wǎng)絡鏈接狀態(tài),而grep -i 80是用來提取與80端口有關的連接的,wc -l進行連接數(shù)統(tǒng)計。 最終返回的數(shù)字就是當前所有80端口的請求總數(shù)。#netstat -nagrep ESTABLISHEDwc -l376netstat -an會打印系統(tǒng)當前網(wǎng)絡鏈接狀態(tài),而grep ESTABLISHED 提取出已建立連接的信息。 然后wc -l統(tǒng)計。最終返回的數(shù)字就是當前所有80端口的已建立連接的總數(shù)。netstat -natgrep ESTABLISHEDwc - 可查看所有建立連接的詳細記錄 查看Apache的并發(fā)請求數(shù)及其TCP連接狀態(tài):linux命令:netstat -n awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'返回結果示例:LAST_ACK 5SYN_RECV 30ESTABLISHED 1597FIN_WAIT1 51FIN_WAIT2 504TIME_WAIT 1057其中的SYN_RECV表示正在等待處理的請求數(shù);ESTABLISHED表示正常數(shù)據(jù)傳輸狀態(tài);TIME_WAIT表示處理完畢,等待超時結束的請求數(shù)。

寧鄉(xiāng)網(wǎng)站建設公司創(chuàng)新互聯(lián),寧鄉(xiāng)網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為寧鄉(xiāng)近1000家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿網(wǎng)站建設要多少錢,請找那個售后服務好的寧鄉(xiāng)做網(wǎng)站的公司定做!

linux編程wait(0)放在最后一句有什么用

wait是等待,等待前面的所有子進程全部執(zhí)行完才繼續(xù)。這里p1=fork(),p2=fork()不是有調用到fork子進程嗎

寫這個的目的是避免上面的還沒執(zhí)行完就開始執(zhí)行后續(xù)的程序了。

我舉個例子,你在執(zhí)行備份后刪除原文件操作,備份還沒進行完,程序就開始刪除了。這樣就會出錯了。

當然你這里后續(xù)沒有操作,wait只是在等待上面的全部做完然后退出整個程序。

linux系統(tǒng)c語言進程不想被sleep阻塞等待怎么解決?

1、啟動后臺子任務,在執(zhí)行命令后加操作符,表示將命令放在子shell中異步執(zhí)行??梢赃_到多線程效果。如下,sleep10#等待10秒,再繼續(xù)下一操作sleep10當前shell不等待,后臺子shell等待。

2、wait命令wait是用來阻塞當前進程的執(zhí)行,直至指定的子進程執(zhí)行結束后,才繼續(xù)執(zhí)行。使用wait可以在bash腳本“多進程”執(zhí)行模式下,起到一些特殊控制的作用。

linux里面的wait和waitpid是什么?

當有多個子進程的SIGCHLD信號到達父進程的時候,如果父進程用wait等待,那么父進程在處理第一個達到的SIGCHLD信號的時候,其他的

SIGCHLD信號被堵塞,而且信號不被緩存,這樣就會導致信號丟失,這樣會產(chǎn)生很多的僵尸進程。。解決辦法是父進程用waitpid來等待子進程信

號。。。

wait

1.1 簡介

wait函數(shù)所需頭文件:

#include sys/types.h

#include sys/wait.h

wait函數(shù)原型:

pid_t wait(int *status);

進程一旦調用了

wait,就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經(jīng)退出,如果讓它找到了這樣一個已經(jīng)變成僵尸的子進程,wait就會收集這個子

進程的信息,并把它徹底銷毀后返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這里,直到有一個出現(xiàn)為止。

參數(shù)status用來保存 被收集進程退出時的一些狀態(tài),它是一個指向int類型的指針。但如果我們對這個子進程是如何死掉的毫不在意,只想把這個僵尸進程消滅掉,(事實上絕大多數(shù) 情況下,我們都會這樣想),我們就可以設定這個參數(shù)為NULL,就象下面這樣:

pid = wait(NULL);

如果成 功,wait會返回被收集的子進程的進程ID,如果調用進程沒有子進程,調用就會失敗,此時wait返回-1,同時errno被置為ECHILD。

1.2 實戰(zhàn)

下面就讓我們用一個例子來實戰(zhàn)應用一下wait調用,程序中用到了系統(tǒng)調用fork,如果你對此不大熟悉或已經(jīng)忘記了,請參考fork函數(shù)的使用。

/* wait1.c */

#include sys/types.h

#include sys/wait.h

#include unistd.h

#include stdlib.h

int main()

{

pid_t pc,pr;

pc = fork();

if (pc 0) /* 如果出錯 */

printf("error ocurred!\n");

else if (pc == 0) /* 如果是子進程 */

{

printf("This is child process with pid of %d\n",getpid());

sleep(10); /* 睡眠10秒鐘 */

}

else /* 如果是父進程 */

{

pr = wait(NULL); /* 在這里等待 */

printf("I catched a child process with pid of %d\n"),pr);

exit(0);

}

}

編譯并運行:

# cc wait1.c -o wait1

# ./wait1

#This is child process with pid of 1508I

#catched a child process with pid of 1508

可以明顯注意到,在第2行結果打印出來前有10秒鐘的等待時間,這就是我們設定的讓子進程睡眠的時間,只有子進程從睡眠中蘇醒過來,它才能正常退出,也就

才能被父進程捕捉到。其實這里我們不管設定子進程睡眠的時間有多長,父進程都會一直等待下去,讀者如果有興趣的話,可以試著自己修改一下這個數(shù)值,看看會

出現(xiàn)怎樣的結果。

1.3 參數(shù)status

如果參數(shù)status的值不是NULL,wait就會把子進程退出時的狀態(tài)取出并存入其中,這是一個整數(shù)值(int),指出了子進程是正常退出

還是被非正常結束的(一個進程也可以被其他進程用信號結束),以及正常結束時的返回值,或被哪一個信號結束的等信息。由于這些信息被存放在一個整數(shù)的不同

二進制位中,所以用常規(guī)的方法讀取會非常麻煩,人們就設計了一套專門的宏(macro)來完成這項工作,下面我們來學習一下其 中最常用的兩個:

1,WIFEXITED(status) 這個宏用來指出子進程是否為正常退出的,如果是,它會返回一個非零值。

(請注意,雖然名字一樣,這里的參數(shù)status并不同于wait唯一的參數(shù)--指向整數(shù)的指針status,而是那個指針所指向的整數(shù),切記不要搞混

了。)

2,WEXITSTATUS(status)

當WIFEXITED返回非零值時,我們可以用這個宏來提取子進程的返回值,如果子進程調用exit(5)退出,WEXITSTATUS(status)

就會返回5;如果子進程調用exit(7),WEXITSTATUS(status)就會返回7。請注意,如果進程不是正常退出的,也就是

說,WIFEXITED返回0,這個值就毫無意義。

下面通過例子來實戰(zhàn)一下我們剛剛學到的內容:

/* wait2.c */

#include sys/types.h

#include sys/wait.h

#include unistd.h

int main()

{

int status;

pid_t pc,pr;

pc = fork(); /*調用fork函數(shù)*/

if (pc 0) /* 如果出錯 */

printf("error ocurred!\n");

else if (pc == 0) /* 子進程 */

{

printf("This is child process with pid of %d.\n",getpid());

exit(3); /* 子進程返回3 */

}

else /* 父進程 */

{

pr = wait(status);

if (WIFEXITED(status))

{

printf("the child process %d exit normally.\n",pr);

printf("the return code is %d.\n",WEXITSTATUS(status));

}

else /* 如果WIFEXITED返回零 */

printf("the child process %d exit abnormally.\n",pr);

}

}

編譯并運行:

# cc wait2.c -o wait2

# ./wait2

#This is child process with pid of 1538.

#the child process 1538 exit normally.

#the return code is 3.

#the child process 1538 exit abnormally.

父進程準確捕捉到了子進程的返回值3,并把它打印了出來。

當然,處理進程退出狀態(tài)的宏并不止這兩個,但它們當中的絕大部分在平時的編程中很少用到,就也不在這里浪費篇幅介紹了,有興趣的讀者可 以自己參閱Linux man pages去了解它們的用法。

waitpid

2.1 簡介

waitpid系統(tǒng)調用在Linux函數(shù)庫中的所需頭文件:

#include sys/types.h

#include sys/wait.h

waitpid系統(tǒng)調用在Linux函數(shù)庫中的原型是:

pid_t waitpid(pid_t pid,int *status,int options);

從本質上講,系統(tǒng)調用waitpid和 wait的作用是完全相同的,但waitpid多出了兩個可由用戶控制的參數(shù)pid和options,從而為我們編程提供了另一種更靈活的方式。下面我們 就來詳細介紹一下這兩個參數(shù):

pid

從參數(shù)的名字pid和類型 pid_t中就可以看出,這里需要的是一個進程ID。但當pid取不同的值時,在這里有不同的意義。

pid0時,等待進程ID等于 pid的子進程,不管其它已經(jīng)有多少子進程運行結束退出了,只要指定的子進程還沒有結束,waitpid就會一直等下去。

pid=-1時,等待任何一個子進程退出,沒有任何限制,此時waitpid和wait的作用一模一樣。

pid=0時,等待同一個進程組中的任何子進程,如果子進程已經(jīng)加入了別的進程組,waitpid不會對它做任何理睬。

pid-1時,等待一個指定進程組中的任何子進程,這個進程組的ID等于pid的絕對值。

options

options提供了一些額外的選項來控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED兩個選項,這是兩個常數(shù),可以用"|"運算符把它們連接起來使用,比如:

ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);

如果我們不想使用它們,也可以把options設為0,如:

ret=waitpid(-1,NULL,0);

如果使用了 WNOHANG參數(shù)調用waitpid,如果沒有任何已終止的進程,它也會立即返回,不會像wait那樣永遠等下去。

而WUNTRACED參數(shù),如果子進程進入暫停執(zhí)行則馬上返回,但終止狀態(tài)不予理睬。

看到這里,聰明的讀者可能已經(jīng)看出端倪了--wait不就是經(jīng)過包裝的waitpid嗎?沒錯,察看內核源碼目錄/include/unistd.h文件349-352行就會發(fā)現(xiàn)以下程序段:

static inline pid_t wait(int * wait_stat){return waitpid(-1,wait_stat,0);}

2.2 返回值和錯誤

waitpid的返回值比wait稍微復雜一些,一共有3種情況:

當正常返回的時候,waitpid返回收集到的子進程的進程ID;

如果設置了選項WNOHANG,而調用中waitpid發(fā)現(xiàn)沒有已退出的子進程可收集,則返回0;

如果調用中出錯,則返回-1,這時errno會被設置成相應的值以指示錯誤所在;

當pid所指示的子進程不存在,或此進程存在,但不是調用進程的子進程,waitpid就會出錯返回,這時errno被設置為ECHILD;

/* waitpid.c */

#include sys/types.h

#include sys/wait.h

#include unistd.h

int main()

{

pid_t pc, pr;

pc = fork();

if (pc 0) /* 如果fork出錯 */

printf("Error occured on forking.\n");

else if (pc == 0) /* 如果是子進程 */

{

sleep(10); /* 睡眠10秒 */

exit(0);

}

else /* 如果是父進程 */

do

{

pr = waitpid(pc, NULL, WNOHANG); /* 使用了WNOHANG參數(shù),waitpid不會在這里等待 */

if (pr == 0) /* 如果沒有收集到子進程 */

{

printf("No child exited\n");

sleep(1);

}

}

while (pr == 0); /* 沒有收集到子進程,就回去繼續(xù)嘗試 */

if (pr == pc)

printf("successfully get child %d\n", pr);

else

printf("some error occured\n");

}

編譯并運行:

#gcc waitpid.c -o waitpid

#./waitpid

#No child exited

#No child exited

#No child exited

#No child exited

#No child exited

#No child exited

#No child exited

#No child exited

#No child exited

#No child exited

#successfully get child 1526

父進程經(jīng)過10次失敗的嘗試之 后,終于收集到了退出的子進程。

因為這只是一個例子程序,不便寫得太復雜,所以我們就讓父進程和子進程分別睡眠了10秒鐘和1秒鐘,代表它們分 別作了10秒鐘和1秒鐘的工作。父子進程都有工作要做,父進程利用工作的簡短間歇察看子進程的是否退出,如退出就收集它。

Linux wait()系統(tǒng)調用

進程一旦調用了wait,就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經(jīng)退出,如果讓它找到了這樣一個已經(jīng)變成僵尸的子進程,wait 就會收集這個子進程的信息, 并把它徹底銷毀后返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這里,直到有一個出現(xiàn)為止。

#include unistd.h

#include signal.h

#include stdio.h

int pid1, pid2;

main()

{

int fd[2];

char outpipe[100],inpipe[100];

pipe(fd);

while((pid1=fork())==-1);

if(pid1==0) //子進程1

{

lockf(fd[1],1,0);

sprintf(outpipe,"child 1 process is sending a message!");

write(fd[1],outpipe,50); //子進程1寫數(shù)據(jù)到管道

sleep(5);

lockf(fd[1],0,0);

exit(0);

}

else //父進程

{

while((pid2=fork())==-1); //創(chuàng)建子進程2

if(pid2==0) //子進程2執(zhí)行

{

lockf(fd[1],1,0); /*mutex*/

sprintf(outpipe,"child 2 process is sending a message!");

write(fd[1],outpipe,50); //子進程2向管道寫數(shù)據(jù)

sleep(5);

lockf(fd[1],0,0);

exit(0);

}

else //父進程

{

wait(0); //等待子進程結束,那就是子進程1先結束了,進程1先創(chuàng)建的寫入數(shù)據(jù)后,延時5s就/結束了

read(fd[0],inpipe,50);//讀管道數(shù)據(jù)

printf("%s\n",inpipe);//輸出的是child 1 process is sending a message!

wait(0); ////////////////////////////再次等待進程結束,這里等的就是進程2.

read(fd[0],inpipe,50);//讀管道數(shù)據(jù)

printf("%s\n",inpipe);//這里輸出 child 2 process is sending a message!

exit(0);

}

}

}

fork()函數(shù)的作用是創(chuàng)建一個進程。在應用程序調用fork()函數(shù)后,會創(chuàng)建一個新的進程,稱做子進程,原來的進程稱做父進程。從這以后,運行的已經(jīng)是兩個進程了,子進程和父進程都可以得到fork()的返回值。對于子進程來說,fork()函數(shù)的返回值是0,對于父進程來說,fork函數(shù)的返回的是子進程的進程號。如果創(chuàng)建進程失敗,fork()函數(shù)會給父進程返回-1,這也是判斷進程是否創(chuàng)建成功的依據(jù)

linux 一個sh小腳本,這里的wait用的對嗎?為什么不是sleep?wait可以這么用嗎?

wait 命令后面跟的參數(shù)是進程的id,根據(jù)我的理解,wait是等待某進程結束后再往下執(zhí)行腳本,如果wait后不跟參數(shù),就是等待以上所有進程都執(zhí)行完后再往下執(zhí)行腳本。

按照你的意思,是要等待一段時間的,則應該用sleep 命令,sleep就是用來延遲一段時間用的,將wait 300 改成sleep 300才正確。


網(wǎng)站題目:包含Linux的wait命令的詞條
本文地址:http://weahome.cn/article/hgcjej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部