Skip to content

2.5 Unix SVR4进程管理

Giovanna

About 543 wordsAbout 2 min

2024-08-31

一、Unix进程控制相关命令

fork():创建一个新进程

exec():执行一个可执行程序

exit():终止

sleep():暂停一段时间

pause():暂停并等待信号

wait():等待子进程暂停或终止

kill():发送信号到某个或一组进程

ptrace():设置执行断点(breakpoint),允许父进程控制子进程的运行

二、fork()命令

调用格式:pid=fork()

在调用fork()之后,父进程和子进程均在下一条语句上继续运行。

父、子进程的fork返回值不同。在子进程中返回时,pid为0;在父进程中返回时,pid为所创建的子进程的标识。

fork()创建子进程之后,执行返回父进程,或调度切换到子进程或其他进程。

fork创建一个新进程(子进程),除了子进程标识符和其PCB结构中的某些特性参数不同之外,子进程是父进程的精确复制。

父、子进程的运行是无关的,所以运行顺序也不固定。若要求父子进程运行顺序一定,则要用到进程间的通信。

image.png

三、fork()调用例子

例1

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

void main(){
    printf("Hello \n");
    fork();
    printf("Bye \n");
}
运行结果
Hello
Bye
Bye

例2

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

int main(){
    int i;
    for(i=0;i<3;i++)
        fork();
    printf("hello, world\n");
    return 0;
}
一共输出多少个hello, world?

3次fork,总共会有232^3个进程,每个进程打印一个"hello, world",一共8个。

例3

void main(void){
    int i;
    static char buffer[10];
    if(fork()==0)
        strcpy(buffer,"Child\n");
    for(i=0;i<5;++i){
        sleep(1);
        write(1,buffer,sizeof(buffer));
    }
}

程序的运行无法保证输出顺序,输出顺序依赖于内核所用的调度算法。

例4

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int global=4;
void main(void){
    int pid;
    int vari=5;
    printf("before fork\n");
    if((pid=fork())<0){
        printf("fork error\n");
        exit(0);
    }else if(pid==0){
        global++;
        vari--;
    }
    printf("global=%d,vari=%d\n",global,vari);
}
父进程运行结果?子进程运行结果?
// 父进程
global=4,vari=5

// 子进程
global=5,vari=4