#include
#include
pid_t fork(void);获取进程标识
pid_t getpid(void);返回:调用进程的进程ID
pid_t getppid(void);返回:调用进程的父进程ID
uid_t getuid(void);返回:调用进程的实际用户ID
uid_t geteuie(void);返回:调用进程的有效用户ID
gid_t getgid(void);返回:调用进程的实际组ID
gid_t getegid(void);返回:调用进程的有效组ID
fork是一个创建进程的过程。
该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是子进程的进程ID。
一般来说,在fork之后是父进各程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。
1#include <sys/types.h> //必需
2#include <stdio.h>
3#include <stdlib.h>
4#include <unistd.h> //必需
7char buf[] = "a write to stdout\n";
8int main()
9 {
11 pid_t pid; //创建进程类型变量pid
13 fprintf(stderr, "%s",buf); //创建进程前的提示
14 printf("before fork\n"); //创建进程前的提示
15
16 if((pid=fork()) < 0 ) //创建管道,进入错误处理程序
17 {
18 fprintf(stderr, "fork error\n");
19 }
20 else if(pid == 0) //"
= 0,进入子进程处理过程中
21 {
24 printf("child process---------------\n");
25 printf("Ownpid = %d, father pid = %d\n", getpid(),getppid());
26 printf("--------\n");
27 }
29 else //pid > 0,进入父进程处理过程中
30 {
31 sleep(2);
32 printf("father process--------\n");
33 printf("Childpid = %d, Ownpid =%d,father pid = %d\n", pid,getpid(), getppid());
34 execlp("ps","ps","-H",NULL); //子进程查看,可参照另外一篇博客内容
35 }
37 return 0;
38 }
|
运行后输出的结果为:
本人机器上的打印信息字幕的大小写有所修改,以下为本人机器上的输出
1diga@diga-desktop:~/test$ gcc -o fork fork.c //编译
2diga@diga-desktop:~/test$ ./fork //运行
3a write to stdout
4before fork
5child process--------------- //子进程
6OWNpid = 3512, father pid = 3511
7--------
8father process--------
9CHILDpid = 3512, OWNpid =3511,father pid = 3453
10--------
11 PID TTY TIME CMD
12 3453 pts/5 00:00:00 bash //可以看出这个是爷爷辈的进程
13 3511 pts/5 00:00:00 ps //这个是父亲辈的进程
14 3512 pts/5 00:00:00 fork <defunct> //这个事儿子辈的进程
15diga@diga-desktop:~/test$
|
进程创建可以在原有进程的基础上重新创建一个子进程,用于同时运行两个应用程序的场合。
比如在原有嵌入式产品功能的基础上我想加入一个网络视频流的播放程序,就可以采用这样的创建进程的方法。有机会一定要试一下。
阅读(982) | 评论(0) | 转发(0) |