當前位置:首頁 » 操作系統 » linux創建子進程

linux創建子進程

發布時間: 2022-03-07 03:13:26

❶ 創建一個子進程打開你的linux系統中的瀏覽器,子進程結束後輸出子進程

#include
#include
#include
#define
BUFSIZE
10
int
main(void)
{
char
ch,dh,eh;
int
p[2];//文件描述符
pid_t
childpid;
if(pipe(p)
==
-1)//創建管道
{
perror("pipe
call");
return
-1;
}
if((childpid
=
fork())
==
-1)//創建子進程
{
perror("fork
call");
return
-1;
}
if(childpid!=0)//父進程
{
close(p[0]);//關閉讀文件
do
{
ch
=
getchar();
write(p[1],&ch,1);//向管道寫
}while(ch!='x');//遇到'x'則結束
}
else
if(childpid==0)//子進程
{
close(p[1]);//關閉寫文件
while(1)
{
read(p[0],&dh,1);//從管道讀
if(dh
==
'x')
{
printf("\n");
return
0;
}
else
if(dh>='a'&&dh<='z')
{
eh
=
(char)((int)dh
-
32);//轉化成大寫輸出
printf("%c",eh);
}
else
{
printf("%c",dh);
}
}
}
}

❷ linux系統中創建子進程的程序,不知道該用getpid()還是getppid()

父進程返回的是是子進程號。他再getppid就成了他父親的了。他這里是要返回他兒子的進程號。他兒子返回的是0,getppid得到他父親的進程號。所以只有在父親這里才可以得到子進程號。

❸ linux 父進程創建子進程的例子

父進程為什麼要創建子進程呢?前面我們已經說過了Linux是一個多用戶操作系統,在同一時間會有許多的用戶在爭奪系統的資源.有時進程為了早一點完成任務就創建子進程來爭奪資源. 一旦子進程被創建,父子進程一起從fork處繼續執行,相互競爭系統的資源.有時候我們希望子進程繼續執行,而父進程阻塞直到子進程完成任務.這個時候我們可以調用wait或者waitpid系統調用.
#i nclude
#i nclude

pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid,int *stat_loc,int options);

wait系統調用會使父進程阻塞直到一個子進程結束或者是父進程接受到了一個信號.如果沒有父進程沒有子進程或者他的子進程已經結束了wait回立即返回.成功時(因一個子進程結束)wait將返回子進程的ID,否則返回-1,並設置全局變數errno.stat_loc是子進程的退出狀態.子進程調用exit,_exit 或者是return來設置這個值. 為了得到這個值Linux定義了幾個宏來測試這個返回值.
WIFEXITED:判斷子進程退出值是非0
WEXITSTATUS:判斷子進程的退出值(當子進程退出時非0).
WIFSIGNALED:子進程由於有沒有獲得的信號而退出.
WTERMSIG:子進程沒有獲得的信號號(在WIFSIGNALED為真時才有意義).
waitpid等待指定的子進程直到子進程返回.如果pid為正值則等待指定的進程(pid).如果為0則等待任何一個組ID和調用者的組ID相同的進程.為-1時等同於wait調用.小於-1時等待任何一個組ID等於pid絕對值的進程. stat_loc和wait的意義一樣. options可以決定父進程的狀態.可以取兩個值 WNOHANG:父進程立即返回當沒有子進程存在時. WUNTACHED:當子進程結束時waitpid返回,但是子進程的退出狀態不可得到.
父進程創建子進程後,子進程一般要執行不同的程序.為了調用系統程序,我們可以使用系統調用exec族調用.exec族調用有著5個函數.
#i nclude

int execl(const char *path,const char *arg,…);
int execlp(const char *file,const char *arg,…);
int execle(const char *path,const char *arg,…);
int execv(const char *path,char *const argv[]);
int execvp(const char *file,char *const argv[]):

exec族調用可以執行給定程序.關於exec族調用的詳細解說可以參考系統手冊(man execl). 下面我們來學習一個實例.注意編譯的時候要加 -lm以便連接數學函數庫.

#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude

void main(void)
{
pid_t child;
int status;

printf(」This will demostrate how to get child status\n」);
if((child=fork())==-1)
{
printf(」Fork Error :%s\n」,strerror(errno));
exit(1);
}
else if(child==0)
{
int i;
printf(」I am the child:%ld\n」,getpid());
for(i=0;i<1000000;i++) sin(i);
i=5;
printf(」I exit with %d\n」,i);
exit(i);
}
while(((child=wait(&status))==-1)&(errno==EINTR));
if(child==-1)
printf(」Wait Error:%s\n」,strerror(errno));
else if(!status)
printf(」Child %ld terminated normally return status is zero\n」,
child);
else if(WIFEXITED(status))
printf(」Child %ld terminated normally return status is %d\n」,
child,WEXITSTATUS(status));
else if(WIFSIGNALED(status))
printf(」Child %ld terminated e to signal %d znot caught\n」,
child,WTERMSIG(status));
}

strerror函數會返回一個指定的錯誤號的錯誤信息的字元串.

❹ 純小白,請Linux怎麼調用fork()創建兩個子進程並運行

是的,需要在cpp裡面調用fork,然後再執行exec。
下面是個例子:

pid_t pid = fork();
if (pid < 0) {
return;
}
else if (pid == 0) {
printf("child process!!!!\n");
char *argv[] = { (char *)"tst_app", (char *)"xx", NULL };
execv("/usr/bin/tst_app", argv);
}
請採納,謝謝

❺ Linux中的用fork()如何由一個父進程創建同時多個子進程

int status,i;
for (i = 0; i < 10; i++)
{
status = fork();
if (status == 0 || status == -1) break;
}
if (status == -1)
{
//error
}
else if (status == 0)
{
//sub process
}
else
{
//parent process
}

❻ Linux中為什麼要創建子進程

創建子進程才能多道程序並發執行,linux初始化的時候會創建swap進程、然後是init進程和一個init進程的兄弟進程,所有的進程(運行的程序)都是從父進程演化出去的,你可以看看proc里的東西,寫個程序列印出各個進程的父進程~網上有源代碼的,要的話我給你

咱要先搞明白進程究竟是什麼,進程是資源分配的單位,是運行的程序。既然是運行的程序,一個進程自然只能代表一個程序,多道程序設計自然而然就有了多進程的概念。舉個例子,多進程(線程)下載,我們可以給一個需要下載的資源分片,多個進程從不同的片分時下載,這樣就提高了下載速度,因為對一個程序分配的更多的資源,你試試開迅雷的時候打開個網頁,保證你覺得奇卡無比,因為網路帶寬(資源)被迅雷的多個進程佔用了。其實在本地的多進程程序並不多見,比如word算是個典型的多進程程序,有個進程接受你的鍵盤輸入,有拼寫檢查進程,有顯示進程等等。大多數都用到網路上了,比如伺服器。一台伺服器要在「同一時間」處理來自很多客戶端的請求,這就必須使用多進程。

❼ linux 創建父進程和子進程並通信問題

看我下面的程序,還有問題可以 hi我

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
int pid, pfd[2], seq;

if (argc != 2)
{
printf("Usage:\t %s num\n", argv[0]);
return 1;
}

seq = atoi(argv[1]);
if (seq <= 0)
{
printf("Error: seq shall be larger than 0.\n");
return 1;
}

pid = fork();
if (pid == 0)
{
/* child 1 */
execlp("/bin/ls", "/bin/ls", "-R", ".", NULL);
}
else if (pid > 0)
{
wait(NULL);
printf("\n\nThis is parent process, child 1 finished.\n");
}

/* create pipe */
pipe(pfd);
pid = fork();

if (pid == 0)
{
/* child 2 */
int next = 1, i, fib = 0, tmp;
close(pfd[0]);
for (i = 0; i < seq; i++)
{
write(pfd[1], &fib, sizeof(fib));
tmp = fib;
fib = next;
next += tmp;
}
/* -1 indicates the end of fibonacci seq */
fib = -1;
write(pfd[1], &fib, sizeof(fib));
return 0;
}
else if (pid > 0)
{
/* parent */
int fib;

close(pfd[1]);
wait(NULL);

printf("In parent process, child 2 finished, time to print fibonacci sequence...\n");
while (read(pfd[0], &fib, sizeof(fib)) == sizeof(fib))
{
if (fib >= 0)
{
printf("%4d ", fib);
}
else
{
printf("\n");
break;
}
}
printf("\n All DONE!\n");
}

return 0;
}

❽ 請教linux下fork()創建子進程

pid = fork(); //創建進程命令點
if(pid < 0){...} //pid<0,表示fork出錯,程序一般會退出,不會出現pid=0和pid>0的情況

else if(0 == pid){...} //從這個點開始,程序出現分支 pid=0表示fork出來的子進程分支
else{....} //否則是原進程,即父進程

printf("here!"); //如果在上面兩個進程都沒有exit()操作時,執行完{}中的命令,都會走到這里

關於fork出來的父子進程關系,請仔細閱讀linux高級編程中進程一章節,內容很多,細細的閱讀並練習體會吧

❾ linux下創建多進程,一個父進程可以有多個子進程嗎,如果可以的話,父進程和多個子進程的關系是什麼

2是誰創建的,他爹就是誰
fork會把子進程數據結構中的父進程號設置為當前進程號

❿ linux父進程創建兩個子進程

#include"stdio.h"
#include"stdlib.h" //exit包含在stdlib.h頭文件中
#include"unistd.h"
int main(void)
{
pid_t pid1,pid2;
pid1=fork();
switch(pid1)
{
case 0: //進程創建成功,返回值為0
printf("b"); //子進程1創建成功,輸出b
break;
case -1:
printf("Process creation failed\n");//子進程創建失敗,輸出錯誤信息
break;
default:
printf("a");//此時執行父進程,輸出a
sleep(1);
exit(0);
break;
}
pid2=fork();
switch(pid2)
{
case 0: //進程創建成功,返回值為0
printf("c"); //子進程2創建成功,輸出c
break;
case -1:
printf("Process creation failed\n");//子進程創建失敗,輸出錯誤信息
exit(0);
break;
default:
printf("a");//此時執行父進程,輸出a
//sleep(1);
exit(0);
break;
}
exit(0);
}

熱點內容
數碼相機編程 發布:2024-09-24 05:21:04 瀏覽:938
js文件解壓 發布:2024-09-24 05:20:51 瀏覽:837
老版編程貓 發布:2024-09-24 05:11:57 瀏覽:869
沙堆解壓 發布:2024-09-24 05:11:22 瀏覽:246
mysql的資料庫備份 發布:2024-09-24 04:51:16 瀏覽:447
夜什麼編程 發布:2024-09-24 04:42:35 瀏覽:629
樂高編程名 發布:2024-09-24 04:41:55 瀏覽:867
華為伺服器配置ibmc地址 發布:2024-09-24 04:25:36 瀏覽:29
android實現視頻通話 發布:2024-09-24 04:24:35 瀏覽:268
如何用anaconda配置環境 發布:2024-09-24 04:17:56 瀏覽:653