linux下fork的使用一

头文件:

 #include <unistd.h>

 函数定义:

 int fork( void );
 返回值:

  子进程中返回0,父进程中返回子进程ID,出错返回-1

 函数说明:

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。


 示例代码:
#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char ** argv )
 {
        int pid = fork();
        if(pid == -1) {
                // print("error!");
        } else if(pid == 0) {
                // print("This is the child process!");
        } else {
                // print("This is the parent process! child process id = %d", pid);
        }
        return 0;
}

Error Codes

fork()系统在Linux中的返回值是没有NULL的.

出错返回错误信息如下:EAGAIN

达到进程数上限.ENOMEM没有足够空间给一个新进程分配。


附:

操作系统对进程的管理,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的信息,进程在系统的唯一标识是PID,PID是一个从1到32768的正整数,其中1一般是特殊进程init,其它进程从2开始依次编号,当用完32768后,从2重新开始。

一个称为“程序计数器(program counter, pc)的寄存器,指出当前占用 CPU的进程要执行的下一条指令的位置。

当分给某个进程的 CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)”,实际的上下文交换需要涉及到更多的数据,那和fork无关,不再多说,主要要记住程序寄存器pc指出程序当前已经执行到哪里,是进程上下文的重要内容,换出 CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统fork()函数用于创建一个新的进程。当进程被复制时,子进程是父进程的副本,包括父进程所有的内存、寄存器、文件描述符和进程状态等信息。但是子进程有自己的进程ID,可以独立运行。 usleep()函数用于让进程休眠指定的时间,单位是微秒。在fork()函数,当父进程调用usleep()函数时,子进程会继承父进程的休眠状态,也就是说,父进程和子进程都会被暂停,直到指定的时间过去才会继续执行。 下面是一个使用fork()和usleep()函数的例子: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid < 0) { perror("fork error"); return -1; } else if (pid == 0) { // 子进程 printf("Child process is running...\n"); usleep(5000000); // 子进程休眠5秒 printf("Child process is done.\n"); exit(0); } else { // 父进程 printf("Parent process is running...\n"); wait(NULL); // 等待子进程结束 printf("Parent process is done.\n"); exit(0); } } ``` 在上面的例子,父进程和子进程都会打印出相应的信息,但是子进程在输出完"Child process is running..."后休眠5秒,然后再输出"Child process is done."。父进程在等待子进程结束后,才会输出"Parent process is done."。 需要注意的是,usleep()函数只是暂停了进程的运行,但是并没有释放CPU资源。如果想要让进程真正地休眠,可以使用sleep()函数或者nanosleep()函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值