如何在linux中创建一个进程

Posted

技术标签:

【中文标题】如何在linux中创建一个进程【英文标题】:How to create a process in linux 【发布时间】:2012-10-11 03:36:01 【问题描述】:

我正在尝试在 linux 中创建一个进程,但是我不断收到错误消息。在我的 c++ 代码中,我只想打开 firefox.exe。这是我的代码:

//header files
#include <sys/types.h> 
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

//main function used to run program
int main()

    //declaration of a process id variable
    pid_t pid;

    //fork a child process is assigned 
    //to the process id
    pid=fork();

    //code to show that the fork failed
    //if the process id is less than 0
    if(pid<0)
    
        fprintf(stderr, "Fork Failed");// error occurred
        exit(-1); //exit
    

    //code that runs if the process id equals 0
    //(a successful for was assigned
    else if(pid==0)
    
        //this statement creates a specified child process
        execlp("usr/bin","firefox",NULL);//child process
    

    //code that exits only once a child 
    //process has been completed
    else
    
        wait(NULL);//parent will wait for the child process to complete
        cout << pid << endl;

        printf("Child Complete");
        exit(0);
    

wait() 函数出错。我忽略了这个并尝试了,但没有任何反应。

【问题讨论】:

如果检查 execlp() 是否有错误,然后确保子进程退出,会发生什么? 【参考方案1】:

你必须写:

execlp("/usr/bin/firefox","firefox",NULL);

你还需要在 execlp 之后加上一个 _exit 以防它失败。

【讨论】:

实际上您确实创建了一个进程(因为fork 没有失败),但是,该进程未能运行firefox,因为您的execlp 错误。教训:始终测试每个系统调用是否成功(当它无法通知用户时,您可以使用perror)。【参考方案2】:

我认为你没有正确调用execlp

它不会将"firefox" 附加到"usr/bin"。因为它会搜索PATH 环境变量,所以您可以使用execlp("firefox","firefox",NULL) 调用它。


旁白: 是的,exec 系列函数允许您打破argv[0] 应该命名可执行文件的名义保证。对不起,就是这样。

【讨论】:

【参考方案3】:

要创建一个进程,您可以使用系统调用、fork 调用、execl 调用。 要了解如何使用这些调用在 linux 中创建进程,请点击以下链接。 我认为它将通过示例帮助您更多地了解流程创建。 http://www.firmcodes.com/process-in-linux/

【讨论】:

以上是关于如何在linux中创建一个进程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中创建一个没有密码的另一个用户的进程?

如何在 FreeBSD 中创建进程间 rwlock?

如何在 Linux Ubuntu 中创建 .sh 扩展名文件? [关闭]

在 Windows 中创建 C++ 非阻塞计时器

如何在 C++ 或 Qt 中创建进程?

如何在 Windows ( C++ ) 中创建进程以运行另一段代码?