Linux C进程与多线程入门—(1)创建进程

进程和程序的区别

进程和程序的区别可以理解为,进程是活动的程序,而程序是一个代码的集合。进程是加载到内存中的程序,而程序没有加载到内存中,在磁盘上保存着。下图是进程的结构,而程序包含代码段

 

 

进程代码实例

fork.c文件

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

int main()
{
pid_t pid;
char *message;
int n;


printf(“fork program starting\n”);
pid = fork();
switch(pid)
{

case -1:
perror(“fork failed”);
exit(1);


case 0:
message = “This is the child”;
n = 5;
break;


default:
message = “This is the parent”;
n = 3;
break;
}

for(; n > 0; n--)

 {
puts(message);
sleep(1);
 }

exit(0);

}

———————————————————————————-

(1)pid_t是进程号,是唯一表示进程的ID

pid_t 是一个宏定义,其实质是int, 被定义在#include<sys/types.h>中)

(2) pid_t fork(void) 函数

   包含的头文件:#include <sys/types.h>

                   #include <unistd.h>

调用fork可以创建一个全新的进程。这个系统调用对当前进程进行复制。在进程表里创建一个新的项目,新项目的许多属性与当前进程是相同的。新进程和原进程几乎一模一样,执行的也是相同的代码,但新进程有自己的数据空间、自己的环境等。

(3)程序调用了fork函数的时候被分成了两个进程。在父进程里,fork函数返回新进程的PID进程号,新进程则返回0,这个可以做为区分父子进程的依据。


父进程和子进程的执行的代码都和fork.c里的代码一致。但是,fork根据不同进程返回不同的PID,那么父子进程的实际有效代码部分是不同的,下面我只写实际有效的代码:

      


(注:sleep函数会让当前进程睡眠,放弃CPUCPU去调度其他进程)

就是说,进程会根据PID的不同,有选择的执行各自的代码。

这个程序将产生两个进程,新进程(子进程)会输出消息5次,而父进程之输出3次。父进程会在子进程打印完它的全部消息之前退出。运行一下这个程序,我们可以看到如下交替输出的消息:

 

这里要提醒大家一点,源文件虽然只有一个,但是运行的进程是2个,而不是1,大家不要混淆。fork函数在父进程里创建了新的进程,两个进程执行的是相同的代码,即代码段是一样的。下面我以后台方式运行该文件的可执行文件(./a.out &)(在输出消息过程中,未输完),我使用ps命令输出当前运行的进程:

 

1592215923是两个不同的进程,和上面说的一样。

可以这样理解:

fork()现在有两个进程在跑,他们可以说是独立的,虽然执行的同一份代码,但是有两个返回值,给子进程返回0,给父进程返回子进程号,失败返回-1.子父进程已经在同时执行了。可以说是有两个名字相同的可执行程序在跑了,这两个程序有父子的关系。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值