1、获取进程的id
int main0()
{
printf ("当前进程 ID %d\n", getpid());
printf ("当前父进程:%d\n", getppid());
printf ("当前用户: %d\n", getuid());
while (1);
return 0;
}
2、fork 和 vfork之前的博客里有,这里就不啰嗦了
// fork
int main1()
{
// fork : 创建一个子进程
// 如果创建失败,返回-1
// 成功返回两个值,如果是在父进程,返回子进程的ID
// 如果是在子进程,返回值是0
pid_t pid = fork();
if (-1 == pid)
{
perror ("fork");
return -1;
}
if (pid > 0) // 父进程
{
printf ("我是父进程,pid = %d\n", getpid());
}
else // 子进程
{
printf ("我是子进程,pid = %d\n", getpid());
}
while (1);
return 0;
}
// fork1 父进程和子进程是异步的,输出都是1
int main2()
{
int count = 0;
pid_t pid = fork();
count++;
printf ("count = %d\n", count);
return 0;
}
// fork2 会产生8个进程
int main3()
{
fork();
fork();
fork();
printf ("a\n");
while (1);
return 0;
}
// fork3 产生20个进程
int main4()
{
fork(); // 产生2个进程
fork() && fork() || fork(); // 之前的每个进程都会产生5个进程
fork(); // 翻倍
printf ("a\n");
while (1);
return 0;
}
// 1、vfork 的子进程必须要显示调用 exit();
// 2、vfork 子进程和父进程共享数据段
// 3、vfork 的子进程先于父进程执行,子进程执行完,CPU才能调度到父进程
int main5()
{
int count = 0;
pid_t pid = vfork();
if (pid < 0)
{
perror ("vfork");
return -1;
}
count++;
if (pid > 0) // 父进程
{
printf ("我是父进程,pid = %d count = %d\n", getpid(), count);
}
else // 子进程
{
printf ("我是子进程:pid = %d count = %d\n", getpid(), count);
while (1);
exit (0);
}
return 0;
}
3、exec函数族
// execl 格式:int execl(const char * path, const char* arg1,...)
int main6()
{
// 第一个参数需要一个路径,能够找到需要执行的文件
// 后面的参数表明执行的方式,和在终端方式类似,如果程序执行需要
// 其他的参数 ls -l,参数要作为函数的实参传过去
// 最后需要补一个 NULL
int ret = execl ("/bin/ls", "ls", NULL);
if (-1 == ret)
{
perror ("exexl");
return -1;
}
return 0;
}
int main7()
{
// 产生一个新的程序,替换了原有的程序,原有的进程 id 是不变的
// int ret = execl ("bin/ls", "ls", "-l", NULL);
int ret = execl ("/bin/ps", "ps", "-ef", NULL);
if (-1 == ret)
{
perror ("execl");
return -1;
}
printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
return 0;
}
// execv 格式:int execv(const char * path, const char *argv[])
int main8()
{
char* a[] = {"file.c", NULL};
int ret = execv("file", a);
if (-1 == ret)
{
perror ("execl");
return -1;
}
return 0;
}
// execlp 格式:int execlp(const char * path, const char* arg1,...)
int main9()
{
int ret = execlp ("./file", "file", NULL);
if (-1 == ret)
{
perror ("execl");
return -1;
}
return 0;
}
int main10()
{
int ret = execlp ("ls", "ls", "-l", NULL);
if (-1 == ret)
{
perror ("execl");
return -1;
}
printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
return 0;
}
// system
int main11()
{
printf ("请选择文件:\n");
system ("ls /home");
char str[100];
while (1)
{
fgets (str, 100, stdin);
printf ("[root@promote 15]# ");
system (str);
}
return 0;
}
int main12()
{
printf ("hello world\n");
sleep (1);
// 在内部fork()一个子进程,调用 /bin/sh -c string来执行
system ("ps -ef | grep a.out");
printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
return 0;
}
4、进程的终止
// 进程退出
void func()
{
printf ("33333333333333333333333\n");
exit (0); // 进程终止
}
int main13()
{
printf ("hello\n");
printf ("1111111111111111");
// 在停止进程前,要检查文件的打开情况,并把文件缓冲区中
// 的内容写回文件才停止进程
exit (0);
return 0;
}
int main14()
{
printf ("hello\n");
printf ("11111111111111111");
// _exit:直接使进程停止,清除其使用的内存,并清除缓冲区中内容
_exit (0);
return 0;
}