Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 操作系统 > Linux > windows c++程序员开始用linux编程(二)创建新进程
【标  题】:windows c++程序员开始用linux编程(二)创建新进程
【关键字】:windows,c++,linux
【来  源】:http://blog.csdn.net/yeyuboy/archive/2007/02/27/1515624.aspx

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

Your Ad Here 在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]
使用VIM开发软件项目 - (4) 保存项目相关配置:【上一篇】
windows c++程序员开始用linux编程(一)编译程序:【下一篇】
【相关文章】
  • 用windows访问ubuntu的文件夹
  • Linux下配置功能完善的Web服务器
  • The Linux MTD, JFFS HOWTO - (第2部分) FAQ (未完待续 2007/2/27)
  • 降低 Linux 内存开销
  • Ubuntu Linux:如何添加中文输入法
  • A Debian WiFi solution (USB WiFi, Windows driver)
  • Windows XP 下安装Perl cpan模块
  • MUI C++ Socket Library
  • 仿基因编程的C++源码
  • 第三章 创建主窗口(Creating Main Windows)
  • 【随机文章】
  • 关于showModalDialog()方法应用(转)
  • 小论java技术框架
  • 安装weblogic petstore时发生的undocumented problem的解决办法
  • Shell 变量
  • 在ASP中如何将代码生成的文件设为只读
  • [水晶報表]動態設定section高度8/4
  • 2001年4月基础知识知识和C语言程序设计答案及评分标准
  • 标题:[推荐]06注册会计师内部讲义,电子书籍,包括五门课程所有的重要材料(上)
  • 绝对隐私:华为公司员工待遇全面揭秘
  • 初识Oracs--Visual Studio的下一个版本
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.