linux进程

#**include** <stdio.h>
#**include** <stdlib.h> #**include** <unistd.h> **int** main(**void**) { printf("%d %d %d\n",getpid(), /*进程ID*/
getpgrp(), /*进程组ID*/
getppid()); /*父进程ID*/
printf("%d %d %d %d\n",getuid(), /*进程实际用户ID*/
geteuid(), /*进程有效用户ID*/
getgid(), /*进程实际组ID*/
getegid()); /*进程有效组ID*/
}
输出为:
{ ~ } » a.exe 5088 5088 6020 197108 197108 197121 197121 { ~ } » **ps** PID PPID PGID WINPID TTY UID STIME COMMAND 5740 6020 5740 704 pty0 197108 14:42:50 /usr/bin/**ps** 6020 4984 6020 6124 pty0 197108 14:26:10 /usr/bin/bash 4984 1 4984 4984 ? 197108 14:26:09 /usr/bin/mintty { ~ } » id uid=197108(Administrator) gid=197121(None) groups=197121(None),114(本地帐户和管理员组成员),197609(HelpLibraryUpdaters),544(Administrators),545(Users),4(INTERACTIVE),66049(控制台登录),11(Authenticated Users),15(This Organization),113(本地帐户),4095(CurrentSession),66048(LOCAL),262154(NTLM Authentication),405504(High Mandatory Level)
进程号为:5672 父进程为:6020 (bash)
用户uid: 197108 用户gid: 197121

获取环境变量

1.env命令
{ ~ } » env HOMEPATH=\Users\Administrator DISABLE_CHECK_ON_STARTUP=false APPDATA=C:\Users\Administrator\AppData\Roaming ProgramW6432=C:\Program Files HOSTNAME=Lu
...
2.environ全局变量
#**include** <stdio.h> #**include** <stdlib.h> #**include** <unistd.h>
**extern** **char** **environ; **int** main(**void**) { **char** **p = environ; **while**(*p) { fprintf(stderr,"%s\n",*p); p++; } }
3.getenv()函数
**char*** name = "COMPUTERNAME"; printf("%s\n",getenv(name)); //若没有键值为name,返回NULL
进程创建
#**include** <stdio.h> #**include** <stdlib.h> #**include** <unistd.h>
**int** main(**void**) { pid_t pid; **int** i = 0; printf("pid = %d, i = %d\n",getpid(),i); **if**((pid = fork() /*pid赋值子进程ID*/ ) > 0 /*原进程*/ )
printf("ppid = %d, cpid = %d\n",getpid(),pid); **else** **if**(pid == 0) /*子进程*/ { printf("cpid = %d\n",getpid()); //子进程id i++; } **else** printf("fork error");
printf("pid = %d, i = %d\n",getpid(),i); //父进程id }
输出为:
{ ~ } » a.exe process start: pid = 1308, i = 0 cpid = 6372 process end: pid = 6372, i = 1 ppid = 1308, cpid = 6372 process end: pid = 1308, i = 0
{ ~ } » a.exe process start: pid = 5772, i = 0 ppid = 5772, cpid = 4308 process end: pid = 5772, i = 0 cpid = 4308 process end: pid = 4308, i = 1
两次执行结果并不相同,说明子进程跟父进程并无先后关系,在fork之后是并行的。

调用执行程序

1.exec
2.fork-exec
3.vfork-exec(高效,shell实际操作方式)
**if**(pid=vfork() == 0) //子进程 { execl("/bin/ls","-l"); }
4.system
system("/bin/ls -l");

vfork和fork

1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。

进程休眠

sleep(1000); //1000秒

进程终止

exit(0); //退出
//1\. exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统;而return 是退出当前函数,返回函数值,把控制权交给调用函数。
//2\. exit是系统调用级别,它表示一个进程的结束;而return 是语言级别的,它表示调用堆栈的返回。
#**include** <stdio.h> #**include** <unistd.h>
**int** main() { pid_t pid,t; **int** status; **if**(pid = fork() == 0) //child process { sleep(1); //sleep 10 seconds printf("pid = %d\n",getpid()); exit(2); } t = wait(&status); printf("pid = %d, wait_pid = %d, status = %d\n ",getpid(),t,status); **return** 0; }
{ ~ } » a.exe pid = 6760 //子进程号= 6760 ,退出号=2 pid = 4140, wait_pid = 6760, status = 512 //父进程号 = 4140, 等待子进程结束,status = exitno << 8;
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")
坚持原创技术分享,您的支持将鼓励我继续创作!