笔记6 linux进程控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hjj651471519/article/details/80178719
进程的特点:
动态性
并发性
独立性
异步性

进程三态:就绪 执行 阻塞
进程ID: PID号
父进程ID:PPID
启动进程的用户ID:UID

进程互斥:若干个进程使用某一个共享资源时,任何时刻最多运行一个进程使用
进程同步:一组并发进程按一定的顺序执行的过程称为进程同步。A - B -C (使用消息和事件同步)
进程调度:抢占式与非抢占式
死锁:多个进程因竞争资源而形成一种僵局,若无外力,这些进程将永远不能再推进。

#include <sys/types.h>
#include <unistd.h>


①pid_t getpid(void)
获取本进程的PID
②pid_t getppid(void)
获取父进程ppid
③pid_t fork(void) ----> #include<unistd.h>
创建一个子进程
1、在父进程中,fork返回新创建的进程PID
2、在子进程中,fork返回0
3、如果出现错误,fork返回一个负值
#include <unistd.h>
#include<stdio.h>
int main(void)
{
pid_t pid;
int count=0;
pid = fork(); //fork后面的代码会被子进程和父进程运行两次

count++;
printf("count = %d\r\n",count);
}
运行结果:(子进程的数据空间、堆栈都会从父进程得到一个拷贝,而不是共享)
count = 1
count = 1
④pid_t vfork(void)
功能:创建子进程,与fork的区别:
fork:子进程拷贝父进程的数据段 , 父、子进程的执行次序不确定
cfork:子进程共享数据段,子进程先运行,父进程后运行
上例:如果用vfork
count = 1
count = 2
⑤exec函数族
exec启动一个徐程序,替换原有的进程,因此PID不会改变。
⑥int execl(const char*path,const char*arg1,....)
path:被执行的程序名( 含路径
arg1--argn:被执行程序所需要的命令行参数,含程序名,以空指针NULL结束。
例子:
#include <unistd.h>
int main(void)
{
execl("/bin/ls","ls","-al","/etc/passwd",NULL);
}
结果:
-rw-r--r-- 1 root root 1841 4月 15 16:56 /etc/passwd

⑦int execlp(const char*path,const char*arg1,....)
path:被执行的程序名( 不含路径,去path环境变量中找)

⑧int execv(const char*path,char* const argv[ ])
path:被执行的程序名( 含路径
argv[ ]:执行程序所需要的命令行参数数组
例子:
#include <unistd.h>
int main(void)
{
char *argv[ ] ={"ls","-al","/etc/passwd",NULL };
execl("/bin/ls",argv);
}

⑨int system(const char *string) ------> #include <stdlib.h>
调用fork产生子进程,由子进程来调用/bin/sh -c string来执行参数string所代表的命令
void main(void)
{
system("ls -la /etc/passwd");
}
⑩pid_t wait(int *status) ---->#include <sys/types.h> #include <sys/wait.h>
阻塞该进程,直到其某个子进程退出




猜你喜欢

转载自blog.csdn.net/hjj651471519/article/details/80178719