Linux进程操作
来源:互联网 发布:混沌与秩序2随从数据库 编辑:程序博客网 时间:2024/05/01 23:22
System系统调用
#include <stdlib.h>
int system(const char *command);
system函数传递给/bin/sh –c 来执行command的命令(启动shell执行command),如果没找到返回127,其他错误返回-1,正确返回0,如果command为NULL,那么返回一个非零值
int main(int arg,char* args[])
{
system("ls -l");
return 0;
}
Fork系统调用
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void); //返回一个PID
在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(fpid<0)……
为什么两个进程的fpid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
printf("begin\n");
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid());
printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
count++;
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
printf("我是孩子他爹/n");
count++;
}
printf("统计结果是: %d/n",count);
printf("end\n");
return 0;
}
Begin输出一次,end输出两次,两次count都为1
fork()会产生两个完全相同的内存空间,然后将父进程代码拷贝,但是子进程只会从fork后开始执行,
例:
int main()
{
pid_t fpid; //fpid表示fork函数返回的值
int i = 0;
for(;i<4;i++)
{
fpid=fork();
}
while (1)
{
sleep(1);
printf("%d\n",getpid());
}
return 0;
}
会产生16个进程
启动一个新的程序,替换原有程序,因此被执行进程的PID不变
#include <unistd.h>
int execve(const char *filename, char *const argv[],char *const envp[]);
filename:要执行程序的完整路径
argv[]:参数列表,包括argv[0],指的是执行程序名
envp[]:执行execed程序的指针,可为NULL
例:
int main()
{
char *arg[] = { "/bin/ls", "-l", NULL };
execve("/bin/ls", arg, NULL);//成功不返回
return 0;//不执行
}
execve与system的区别
system是在本进程中调用另一个程序
execve是用另一个程序替代本程序
收集子进程退出状态
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
//当fork出多个子进程时,要确定wait哪个进程
pid_t waitpid(pid_t pid, int *status, int options); // options一般为0
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
例:
int main ()
{
pid_t fpid;
int stat;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("child start\n");
sleep(2);
printf("child end\n");
return 100;
}
else {
printf("parent start\n");
wait(&stat);
// waitpid(17256, statu,0);
//等到子进程退出才能执行,返回子进程返回值,因此一定先出现child end才会出现parent end
printf("%d\n",WEXITSTATUS(stat));//stat直接无法识别必须用宏定义
printf("parent end\n");
}
return 0;
}
僵死进程:子进程早已退出,而父进程在wait等待回收状态,子进程虽然死掉了,资源释放了,但在内核进程表中保留了一条等待父进程回收。
- Linux进程操作
- linux进程关系操作
- linux进程操作(1)
- linux 进程操作
- Linux下进程操作
- Linux 进程操作_12
- linux进程操作
- linux 进程操作
- Linux 进程操作细节
- 第十节 linux进程操作
- Linux的进程操作
- Linux进程操作命令
- Linux进程 -- fork操作
- Linux进程操作
- Linux进程操作
- linux进程操作
- Linux进程基本操作
- Linux进程操作命令
- iOS学习之路-UIPickerView初认识与使用
- Boost库的编译安装
- srs之简单优势
- Android中Window添加View的底层原理
- iOS适配注意点
- Linux进程操作
- mysql 查询死锁以及解锁
- Linux常用指令大全
- 多数据库的应用Spring+SpringMVC+Mybatis
- 触发器的使用
- redis-windows服务安装
- 安装完linux后简单制作一些安全设置
- Hadoop Native Libraries
- Android 自定义控件前言