您的位置  > 互联网

怎么用linuxfork创建子进程的相关知识点

fork()函数通过系统调用创建一个与原进程几乎一模一样的进程,即两个进程可以做一模一样的事情,但如果初始参数或传入的变量不同,则两个进程还可以做不同的事情。 。

1. pid_t fork(void);

功能:创建父子进程

参数:无

返回值: 成功: 在父进程中: 返回值是子进程的PID

在子进程中:返回值为0 失败:-1 注意:

1)fork函数用于创建进程。 fork后会生成两个进程。 每个进程都会有一个返回值,因此父进程中返回的是子进程的进程号(>0); 子进程中返回0。

2)子进程复制父进程的几乎所有内容。 包括代码、数据、系统数据段中的pc值、堆栈中的数据、父进程中打开的文件等; 但他们的PID和PPID是不同的。

3)父子进程拥有独立的地址空间,互不影响; 当全局变量和静态变量在相应的进程中改变时,它们不会互相影响。

4)如果父进程先结束,则子进程成为孤儿进程,并被init进程收养(此时子进程的父进程为init),子进程成为后台进程。 (init进程号为1)

5)如果子进程先结束,父进程没有及时回收,子进程就会成为僵尸进程(避免僵尸进程的产生)

2. pid_t(void);

功能:获取调用该接口的进程的进程号

返回值:获取PID号

3. pid_t(void);

功能:获取调用该接口的进程的父进程号

返回值:获取PID

4. pid_t wait(int *) 头文件

功能:阻塞并等待任意子进程结束。 回收的资源是一个整型指针。 指向的对象用于保存子进程退出时的状态。 如果为空,则表示忽略子进程退出时的状态。 如果不为空,则表示保存子进程退出时的状态。 另外,子进程的结束状态可以通过Linux中的一些特定的宏来测量。

5. pid_t(pid_t pid, int *, int)

作用:等待子进程结束并回收资源

范围:

(1)pid:pid>0:只等待进程ID等于pid的子进程。 无论其他子进程已经运行完毕并退出,只要指定的子进程还没有结束,就会继续等待。 pid=-1:等待任何子进程退出,与wait作用相同。

(2): 与等待相同

(3)::不阻塞,返回0(未收到),pid号(成功收到) 0:与wait相同,阻塞父进程,等待子进程退出。 失败-1,成功pid号返回值: 正常:终止子进程的进程号,使用选项且没有子进程结束时:0 错误:-1 等价:wait(NULL) == (-1, NULL, 0 ) ()

6. 无效退出(int); 功能:结束调用过程。 程序结束前缓存区会被清空。

7. _exit: void _exit(int); 功能:结束调用过程。 程序结束前缓存区域不会被清除。 注意:它是一个整数参数。 您可以使用此参数来传递进程结束时的状态。 通常0表示正常结束; 其他值表示发生错误,进程异常结束。 在实际编程中,可以使用wait系统调用来接收子进程的返回值并进行相应的处理。 exit用于结束整个正在运行的程序。 将参数返回给OS,并将控制权交给操作系统; 相反,它退出当前函数,返回函数值,并将控制权交给调用函数。

fork 创建子进程的示例:

 #include #include #include #include #include  int main(int arGC, const char *argv[]) {     pid_t pid;     pid = fork();     if(pid == -1)//失败返回 -1     {         perror("fork fail : ");         exit(1);     }     else if(pid == 0) //在子进程中:返回值为0     {         printf("child\n");         printf("child getpid() %d \n",getpid());         printf("child getppid() %d \n",getppid());         exit(1);     }     else //在父进程中:返回值为子进程的PID     {         int s;         wait(&s);         printf("fork\n");         printf("father pid %d\n",pid);//子进程pid         printf("father getpid() %d \n",getpid()); //父进程pid         printf("father getppid() %d \n",getppid());//父进程的父进程的pid         printf("father %d\n",WEXITSTATUS(s));         perror((char*)&s);     }     return 0; }

测试:

子进程会复制父进程的所有内容,并输出pid号和ppid号。 然而,子进程程序是在fork函数之后执行的。

以上就是《如何使用Linux fork创建子进程》一文的全部内容。 感谢您的阅读! 相信大家看完这篇文章都会有所收获。 小编每天都会为您更新不同的知识。 如果您想了解更多知识,请关注编程网操作系统频道。