11.进程控制
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 //获取线程的属性
6 void TestPid()
7 {
8 //进程线程编号
9 printf("My Pid: %d\n",getpid());
10 // 父进程线程编号
11 printf("Parent Pid: %d\n",getppid());
12 //同组线程编号
13 printf("groutp pid:%d\n",getpgrp());
14
15 //用户id
16 printf("uid:%d\n",getuid());
17 //有效用户id
18 printf("euid:%d\n",geteuid());
19 //进程到组id
20 printf("gid:%d\n",getgid());
21 //进程到有效组id
22 printf("egid:%d\n",getegid());
23
24 //chmod u+s uid_demo 改变运行程序的运行权限,使程序暂时拥有文件属主到用户权限
25 }
26
27 //fork
28 void TestFork()
29 {
30 pid_t pid;
31
32 pid = getpid();
33 printf("MyPid:%d\n",pid);
34
35 pid = fork();//分裂成两个进程执行以下语句,不共享进程资源,同时调用
36 //pid = vfork();//共享进程资源,子进程先执行,执行完之后再执行父进程
37
38 if(pid <0 )
39 {
40 perror("Fail to fork");
41 return;
42 }
43
44 //如果是子进程
45 if(pid == 0)
46 {
47 printf("This is a child process [%d]\n",getpid());
48 //执行另一个程序作为原进程到子进程,后面的语句不会执行
49 execl("./file","./file",NULL);
50 printf("2134");
51
52 }
53 //如果是父进程
54 else
55 {
56 printf("This is a parent process [%d]\n",getpid());
57 }
58
59 //退出,资源由父进程进行释放。,如果是类不会调用析构函数
60 _exit(0);
61 //exit(0),资源被子进程进行释放
62 //return 资源出栈,会调用析构函数
63 }
64
65 //execl execv
66 void TestExec()
67 {
68 pid_t pid = fork();
69
70 if(pid == 0)
71 {
72 //child
73 printf("I am child [%d]\n",getpid());
74
75 //execl("/bin/ls","ls","-l",NULL);
76 char *argv[3] = {"ls","-l"};
77 execv("/bin/ls",argv);
78 printf("I can not to be printed");
79 }
80 else
81 {
82 printf("I am father [%d]\n",getpid());
83 }
84 }
85
86 int main()
87 {
88 //TestPid();
89 //TestFork();
90 TestExec();
91
92 return 0;
93 }