进程控制常用函数

获取进程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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值