windows c++程序员开始用linux编程(二)创建新进程

在windows下,创建一个进程可以用CreateProcess,它将启动另一个程序;
而在linux下,创建一个进程可以用fork,顾名思义就是“分叉”,调用fork就像孙悟空叫一声“变”,于是出现了两个孙悟空,而且两个人在当时是完全一样的,他们共享同样的过去,但他们通常应该有不一样的未来,于是两个孙悟空要立即判断出自已是不是变出来的那一个,这就要使用调用fork后的返回值,然后就可以做符合身分的事了。那如果程序只能创建自已的复本,linux不就只能运行一个程序的多个复本吗?还没完呢,通过fork的返回值判断出自已是复本,就可以立即调用某个以exec开头的系统函数执行另一个程序,这个程序将替换自已。
表面上看起来linux下的多进程较之windows下的多进程要复杂一些,要先“分叉”(即fork)再变身(即exec*),这样的两步走肯定是有好处的,只fork不exec*,不就像windows下的多线程了吗?
看看这篇文章: Linux下的多进程编程 ,你就更明白了。

fork演示程序:
#include <sys/types.h>
#include <unistd.h>
#include <iostream>

int main()
{
        int i;
        std::cout << "before fork." << "/tpid:" << getpid() << std::endl;
        if(fork() == 0) //child process
        {
                std::cout << "child process." <<  "/tpid:" << getpid() << std::endl;
        }
        else
        {
                std::cout << "main process." <<  "/tpid:" << getpid() << std::endl;
        }
        std::cout << "end fork." <<  "/tpid:" << getpid() << std::endl;
        return 0;
}

exec*函数可以将调用的进程用新进程替换,以execl为例,做做练习:
[code]
//file: demo_execl.cpp
#include <iostream>
#include <sys/unistd.h>

int main(int argc, char* argv[])
{
 if(execl("./print_cmdline.out", "arg0", "arg1", (char*)0) < 0)
 {
  std::cout << "execl error" << std::endl;
  return -1;
 }

 return 0;
}
[/code]

[code]
//print_cmdline.cpp
#include <iostream>

int main(int argc, char* argv[])
{
 for(size_t i = 0; i < argc; ++i)
  std::cout << argv[i] << " ";
 std::cout << std::endl;
 return 0;
}
[/code]

$g++ demo_execl.cpp -o demo_execl.out
$g++ print_cmdline.cpp -o print_cmdline.out
$ ./demo_execl.out
arg0 arg1

哎呀,print_cmdline.out的argv[0]竟然不是"./print_cmdline.out",那怎么在print_cmdline.out获得程序自身的名称啊,我以前一直取用argv[0]的?在linux下你应该这样做:
[code]
//file:getAppPathName.cpp
#include <sys/types.h>
#include <sys/unistd.h>
#include <iostream>
#include <string>

std::string getAppPathName();

int main()
{
        std::cout << getAppPathName() << std::endl;
        return 0;
}

std::string getAppPathName()
{
        char buffer[2048];
        int count = readlink( "/proc/self/exe", buffer, sizeof(buffer)/sizeof(buffer[0]) );
        assert( count >= 0 && count < sizeof(buffer)/sizeof(buffer[0]) );
        buffer[count] = '/0';
        return buffer;
}
[/code]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值