1. 程式人生 > >linux學習之進程篇(二)

linux學習之進程篇(二)

通過 passwd 查看 現在 替換 cnblogs exe -1 stdio.h

進程原語

1.fork

#include<unistd.h>

 pid_t fork(void);

 技術分享

fork

  子進程復制父進程,子進程和父進程的PID是不一樣的,在克隆pcb時,pid沒有復制,fork還有底層的函數,如creat(),clone(),retrun 返回。子進程執行的第一條語句是return。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
   pid_t pid;
   int n=10;
   //調用一次返回兩次,在父進程返回子進程的PID,在子進程返回0;
pid=fork();//父和子都存在了 if(pid>0) { /*in parent*/ while(1){ printf("I am parent\n",n++); printf("my pid="%d\n",getpid()); printf("my parent pid="%d\n",getppid()); sleep(1); } } else if(pid==0) {
/*in child*/ while(1) { printf("I am ch\n",n++); printf("my pid="%d\n",getpid()); printf("my parent pid="%d\n",getppid()); sleep(1); } } else { perror("fork"); exit();//創建進程失敗 } return 0; } //讀時共享,寫時復制,只讀時通過虛擬地址映射到同一物理地址,只有進行寫操作時才拷貝一份物理地址,這樣不會造成物理地址的浪費。

進程相關函數:

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

pid_t getpid(void);//返回調用進程的PID
pid_t getppid(void);//返回調用進程的PID

uid_t getuid(void);//返回實際用戶ID
uid_t geteuid(void);//返回有效用戶ID

gid_t getgid(void);//返回實際用戶組ID
gid_t getegid(void);//返回有效用戶ID

技術分享

sudo chmod 04755 文件名

如passwd命令,可用ls -l 查看其權限位,其在執行時候,臨時身份變為了root。

vfork

  • 用於fork後馬上調用exec函數
  • 父子進程,共用同一地址空間,子進程如果沒有馬上exec而是修改了父進程出得到量值,此修改會在父進程中生效
  • 設計初衷,提高系統效率,減少不必要的開銷
  • 現在fork已經具備讀時共享寫時復制機制,vfork逐漸廢棄。

2.exec族

技術分享

exec

exec加載一個程序,替換掉APP的代碼段,堆,棧。

#include<stdio.h>
#include<unistd.h>

int main(void)
{
    printf("hello\n");
    execl("/bin/ls","ls","-l",NULL);
   //後邊這一句不會再執行了
    printf("world\n");
   return 0;
}

linux學習之進程篇(二)