操作系統導論第五章

  • 操作系統導論

  • 第五章

  • 編碼作業作業

categories:

  • 操作系統導論

操作系統導論第五章:進程API

UNIX的系統調用

UNIX採用一對系統調用:fork()函數和exec()函數,非常有趣的創建新進程。

父進程還可以通過第三個系統調用wait(),等待其創建的子進程完成並且回收,注意,子進程不能調用it(),否則wait()函數會返回-1,而父進程調用則會返回子進程的PID。

fork()函數

先貼一段簡單的調用fork函數的代碼

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
printf("hello,world.\n");
int x = 100;
int rc = fork();
if(rc<0)
{
fprintf(stderr,"fork failed\n");
exit(1);
}
else if(rc==0)
{
printf("hello,I am child\n");
printf("x=%d\n",x+7);
}
else{
printf("hello,I am parent\n");
printf("x=%d\n",x+8);
}
return 0;
}

運行結果是:

可以看到是各改變各的值,並沒有出現疊加的情況,父程序x變爲108,子程序變爲107a。
說明父子程序的變量x雖然擁有一樣的初值,但是他們保存的地址是獨立的,不同的,所以他們保存的值也是不同的,也就是他們完全擁有互相獨立的數據和地址。
注意,fork函數的返回值父進程返回1,子進程返回0,除此之外,這兩個進程完全相同。

exec函數調用

#include<unistd.h>
#include<fcntl.h>
#include<sys/wait.h>
int main()
{

int rc = fork();
if(rc<0)
{
fprintf(stderr,"fork failed\n");
exit(1);
}
else if(rc==0)
{
printf("child\n");
execl("/bin/ls","ls","-l",NULL);
execle("/bin/ls","ls","-l",NULL,NULL);
execlp("/bin/ls","ls","-l",NULL);

char *m[] = {"ls","-l",NULL};
execve("/bin/ls",m,NULL);
execv("/bin/ls",m);
execvp("/bin/ls",m);

exit(1);
}
else{
printf("parent\n");
}
return 0;
}

exec()函數族有六個變體
根據參數類型,大體可以分爲兩類:
• 以 list 可變參數傳參
• execl
• execlp
• execle
• 以 vector 數組傳參
• execv
• execvp
• execve
在這裏插入圖片描述
各個函數變體參數如上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章