获取进程ID
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
printf("Get my ID:%d\n", getpid());
printf("Get my father's ID:%d\n", getppid());
return 0;
}
#include <unistd.h>
#include <sys/types.h>
pid_t fork(void);
父进程中返回子进程的id号;子进程中返回0;出错返回一个负值。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid = fork();
if (pid < 0)
printf("Fork Error!\n");
else if (pid == 0)
printf("This is the child process!\nMy PID is:%d\nMy PPID is:%d\n", getpid(), getppid());
else
{
sleep(1);//如果不延时,在ubuntu12.04中总是先执行父进程,而子进程再显示时,其ppid变为init进程
printf("This is the father process!\nMy PID is:%d\nMy PPID is:%d\n", getpid(), getppid());
}
return 0;
}
#include <unistd.h>
#include <sys/types.h>
pid_t vfork(void);
和fork一样,父进程中返回子进程的id号;子进程中返回0;出错返回一个负值。两者区别主要在于fork拷贝数据段、堆栈,vfork共享数据段、堆栈;fork执行次序不确定,vfork子进程先运行。
在测试vfork是否共享数据段时还遇到一个死循环的问题
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
int count = 0;
pid = vfork();
if (pid < 0)
printf("vfork error!\n");
else if (pid == 0)
{
count++;
printf("Child Process, count=%d\n", count);\
}
else
{
count++;
printf("Father Process, count=%d\n", count);\
}
return 0;
}
上面的进程会不停的循环打印,造成这样的原因是,调用vfork后,子进程要么_exit(),要么调用exec()函数族,否则都是未定义行为。在子进程打印后,加入_exit(0),就不会产生死循环了。
exec用被执行的程序替换掉调用它的程序。
#include <unistd.h>
int execlp(const char *file, const char *arg, ...);
#include <unistd.h>
int main()
{
execlp("ls", "ls", "-al", "/etc/passwd", NULL);
return 0;
}
#include <stdlib.h>
int system(const char *command);
调用fork产生子进程,由子进程来调用/bin/sh -c command来执行参数command所代表的命令。
#include <stdlib.h>
int main()
{
system("ls -al /home");
return 0;
}
进程等待
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
阻塞该进程,直到某个子进程退出。返回值是退出子进程的id号,形参是结束的状态值,如果不在意设为NULL即可。
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid, childpid;
pid = fork();
if (pid < 0)
printf("Fork Error!\n");
else if (pid == 0)
{
printf("This is the Child Process with ID:%d\n", getpid());
sleep(2);
}
else
{
printf("This is the Father Process with ID:%d\n", getpid());
childpid = wait(NULL);
printf("I catch a process with ID:%d\n", childpid);
}
return 0;
}