㈠ 關於c語言fork函數的運行結果求生成結果的詳細過程
看起來你這段程序很難結束了。
首先父進程會創建4個子進程;
然後,因為父子進程共用代碼段,於是子進程也會把for循環執行4次,每個子進程繼續4個子進程;
最後,子進程創建的子進程,依然會繼續創建4個子進程,所以,沒完沒了。
因fork會返回2個值,返回非零,是創建的子進程號,此時在父進程中;返回零是在子進程中;
所以,一般來說:應該根據fork的返回值來使代碼選擇不同的執行路徑,簡單舉例:
if (fork() !=0 )
{
parent process do something
}
else
{
child process do something
}
㈡ C語言中怎麼用fork()創建子進程運行程序並且計算時間
1、fork一般用於處理多線程任務。比如在網路中,需要同時發送多種請求報文,則可以fork出子進程來進行發包任務,而父進程則直接去做自己的邏輯任務。
2、所謂運行時間指的是已經運行了多長時間還是從進程創建到進程退出的時間?輸入的程序是由程序啟動還是已經在運行的
,如果是已經存在的,就試著去獲取進程創建時間(WIN32
提供這樣的API),然後獲取當前時間,就可以得到進程已經運行了多久。如果是程序啟動的,那就用類似time這種函數打樁就可以了。
㈢ c語言中用fork()和excel()實現控制台的指令
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#define BUFFERSIZE 40
int main()
{
char request,ch;
char leftover[BUFFERSIZE];
int pid, status;
printf("Please Enter Command:\n");
scanf("%c", &request);
ch = getchar();
while(request != 'Q')
{
fgets(leftover, sizeof(leftover), stdin);
pid = fork();
if(pid > 0)
{
wait(&status);
printf("Please Enter Command:\n");
scanf("%c", &request);
ch = getchar();
}
else if (pid == 0)
{
if (execl("/bin/sh", "sh", "-c",leftover,(char *)0) == -1)
{
printf("%s",strerror(errno));
exit(-1);
}
exit(-1);
}
else
exit(-1);
}
printf("GoodBye!\n");
return 0;
}
在linux下vi編輯器下編寫代碼,gcc編譯運行測試過,希望對你有幫助。上面的編程主要是利用了進程編程的一些知識,推薦看看《Unix環境高級編程》(APUE),相信會對編程有很大的提高,大家共同進步。
㈣ C語言中的fork和pipe的問題
fork -----> fork -----> fork
加入進程A fork出了進程B,然後進程B又fork出了進程C,進程C又fork出了進程D
pipe是管道,只有一個入口,一個出口。可以把入口和出口分別放到父子進程中。
父進程負責讀,子進程負責寫。或者子進程讀,父進程寫。
你的例子里,在進程A里創建管道PipeA,然後fork出進程B。進程AB之間使用PipeA通信。
進程B再創建PipeB,然後進程BC之間使用PipeB通信。
進程C再創建PipeC,然後進程CD之間使用PipeC通信。
如果想把進程A的數據傳遞給進程D,那麼應該:進程A向PipeA寫入數據,進程B從PipeA中讀取數據,然後再寫入PipeB,進程C從PipeB中讀取數據,然後再寫入PipeC,進程D從PipeC中讀取數據
㈤ fork函數是什麼
C語言裡面,fork函數是用來創建子進程的
㈥ 關於c語言中fork()和execv()的問題
fork----->fork----->fork加入進程Afork出了進程B,然後進程B又fork出了進程C,進程C又fork出了進程Dpipe是管道,只有一個入口,一個出口。可以把入口和出口分別放到父子進程中。父進程負責讀,子進程負責寫。或者子進程讀,父進程寫。你的例子里,在進程A里創建管道PipeA,然後fork出進程B。進程AB之間使用PipeA通信。進程B再創建PipeB,然後進程BC之間使用PipeB通信。進程C再創建PipeC,然後進程CD之間使用PipeC通信。如果想把進程A的數據傳遞給進程D,那麼應該:進程A向PipeA寫入數據,進程B從PipeA中讀取數據,然後再寫入PipeB,進程C從PipeB中讀取數據,然後再寫入PipeC,進程D從PipeC中讀取數據
㈦ c語言調用函數while((p1=fork())==-1)是什麼意思
fork函數是在當前進程中新建立一個子進程,如果這個創建子進程失敗,那麼返回-1,這個實際是把創建進程的返回值和-1比較看看是否創建失敗。
因為是寫在while語句里,那麼當創建失敗之後,如果在while裡面沒有break或者跳出,當while執行體執行結束後又會執行(p1=fork())==-1,等於不斷重復創建子進程一直到創建成功為止。
注意這里會返回兩次,因為父進程創建子進程的時候復制了父進程的地址空間,那麼父子進程地址空間的語句執行都在等待fork返回的那句話里。
所以返回兩次是父進程返回一個,返回的是子進程的ID,子進程返回一次,返回的是0.
那麼我們根據不同的返回值就可以分別寫出我們想要的父子進程的邏輯。
#include
#include
#include
int
main()
{
int
p
=
-1;
while
(
(p
=
fork())
==
-1
)
{
std::cout
<<
"create
process
failed!"
<<
std::endl;
}
if
(p
==
0)
{
std::cout
<<
"this
is
in
the
child
process!"
<<
std::endl;
}
esle
{
std::cout
<<
"this
is
in
the
father
process!"
<<
std::endl;
}
}
㈧ C語言 fork()相關問題
多個進程的執行順序是不確定的。
pid是系統分配的進程號,每次運行系統分配的是不一樣的
㈨ 有沒有人知道,為什麼在jni的c語言代碼里fork子線程不成功
1、fork一般用於處理多線程任務。比如在網路中,需要同時發送多種請求報文,則可以fork出子進程來進行發包任務,而父進程則直接去做自己的邏輯任務。
2、所謂運行時間指的是已經運行了多長時間還是從進程創建到進程退出的時間?輸入的程序是由程序啟動還是已經在運行的 ,如果是已經存在的,就試著去獲取進程創建時間(WIN32 提供這樣的API),然後獲取當前時間,就可以得到進程已經運行了多久。如果是程序啟動的,那就用類似time這種函數打樁就可以了。