相关疑难解决方法(0)

fork系统调用的应用

fork用于创建从中调用的进程的副本.通常会调用exec系列函数.除此之外还有叉子的用法吗?我能想到一个.用管道功能做IPC.

unix fork

6
推荐指数
3
解决办法
3443
查看次数

让程序立即在命令行返回,因此它不依赖于启动它的shell

从命令行启动时,某些程序会立即返回,例如Firefox.大多数实用程序(以及我编写的所有程序)都与创建它们的shell绑定在一起.如果你控制命令行,程序就死定了.

你有什么必须添加到程序或shell脚本以获得立即返回的行为?我想我在那里问了两个问题,一个用于shell脚本,一个用于一般,如果它们不同的话.我特别想知道是否有办法让一个可执行的jar来做.

我几乎不好意思问一个,但我自己找不到答案.

谢谢!

linux shell command-line return process

5
推荐指数
2
解决办法
3572
查看次数

如何使用 python fork 避免失效进程?

在 python3 中,我正在创建分叉的子进程,我认为它是正确退出的。这是一些代码示例:

import os

child_pid = os.fork()
if child_pid == 0:
    print("I am in the child with PID "+str(os.getpid()))
    # doing something
    a = 1+1
    print("Ending child with PID "+str(os.getpid()))
    os._exit(0)
else:   
    #parent process      
    os.waitpid(-1, os.WNOHANG)
    import time
    for x in range(100):
        time.sleep(1)
        print("waiting...")                                        
Run Code Online (Sandbox Code Playgroud)

现在,由于子进程似乎已结束,因此它仍然可以被视为“已失效”进程(而父进程仍在运行)。如何真正摆脱已结束的子进程?如何更改代码?

python python-3.x

5
推荐指数
1
解决办法
3055
查看次数

在Linux中启动和停止Perl守护进程

我一直在为Linux的perl守护进程工作,这是它的骨架:

#!/usr/bin/env perl
use File::Copy;
use Socket;
use Sys::Hostname;
use POSIX qw(setsid);
use Env;

use Sys::Info::Constants qw( :device_cpu );

my $daemonName = 'proc';

my $proc;
my $error;
my $file = "Proc.pl";
my $pidfile = ">/var/run/proc.pid";
my $pid2check = "/var/run/proc.pid";
my $pid;


if (!$error) {
    LogMessage("$daemonName  : PID $proc : Begin");
}

if (!$error) {
    LogMessage("$daemonName  : PID $proc : Writing pid information to $pidfile");
    print FILE $proc . "\n";
    close (FILE);
}

$SLEEP_TIME = 5; # seconds

#Main loop of …
Run Code Online (Sandbox Code Playgroud)

linux perl daemon

4
推荐指数
1
解决办法
1608
查看次数

为什么在守护进程时fork()两次?

我wodering为什么人们叫fork()两次,为什么在执行第一个呼叫之前 setsid().

是的,如果调用者已经是进程组负责人,则不会创建新会话.但是,如果我不让(大)父母成为流程组组长呢?谁会为我做(不问我)?(好吧,也许1llum1n4t1,Sc13nt0l0gy,国家安全局,......;))

是的,第一个孩子应立即退出,不要创建僵尸进程.但是,(大)父母不能在分叉后退出吗?或者一两个fprintf(stderr,...或者write(2,...电话(如"成功启动守护程序xy")会是如此重要?(我不能以另一种方式阻止僵尸吗?)

总而言之,这种双重fork()"神奇"真的需要(不要麻烦)吗?或者它只是传统或所谓的"最佳实践"(如避免goto)?或者它是否只是保证守护进程能够处理"历史"(当然我的意思是"在生产环境中使用太旧")平台,如SVr4,BSD 3,RHEL 2或一些蹩脚的32位嵌入式平台?

c unix posix fork daemon

3
推荐指数
1
解决办法
3214
查看次数

如何在bash shell中实现管道?

我正在尝试为shell执行管道实现.我已经按照以下方式实现了它的工作原理.例如:如果我想这样做,ls | grep x | grep y | grep z,我正在从父进程创建4个子进程并使用它们.有没有其他方法可以做到这一点?

例如:我可以使用以下流程创建它吗?而不是让单个父进程有4个孩子,'grep z'可以是'grep y'的孩子而'grep y'是'grep x'的孩子,依此类推?

我很好奇如何在bash shell中实现管道功能.我尝试下载源代码并理解它但丢失了.

unix linux bash shell

2
推荐指数
1
解决办法
891
查看次数

为什么要从子 shell 启动后台进程/为什么要在 (someCommand &) 中添加括号?

我遇到过一个正在运行的脚本(myDir/myScript.sh arg1 arg2 &)

根据我的理解,它在子 shell 中以及该子 shell 的后台运行脚本。

myDir/myScript.sh arg1 arg2 &如果我运行不带括号的脚本来创建新的子 shell,会产生任何副作用吗?

linux bash

2
推荐指数
1
解决办法
492
查看次数

我如何开始在类似Unix的操作系统(如Linux)中编写守护程序进程?

我正在用PHP做一个工具供我个人使用.但PHP非常慢,我需要做的任务需要花费很多时间,因此我将在c ++中创建一个守护进程并将其保留在后台(它将在VPS中运行).

PHP将通过简单的tcp套接字连接到守护进程(我将尝试设计/使用简单的IPC协议)以提交任务.守护程序将使用简单的FIFO队列管理任务.PHP只会启动任务,但它不会等到它结束,因为它可能需要几分钟(PHP也会监视任务 - 但这是另一个主题).

Web/PHP界面根本不是问题.但我没有unix守护程序编程的经验.我在Linux上用c ++制作了简单的控制台程序,所以我只需要一本手册/书籍/指南和建议来开始使用unix守护进程.

谢谢.

c++ unix linux daemon ipc

1
推荐指数
1
解决办法
8724
查看次数

c ++ fork,无需等待,解散execl

希望在c ++中分叉一个不会挂起其父进程的进程 - 它的父进程是守护进程并且必须保持运行.如果我在分叉进程上等待(),分叉的execl将不会分流 - 但是 - 它也会挂起应用程序 - 而不是等待修复应用程序挂起 - 但命令变得无法解决.

if((pid = fork()) < 0)
    perror("Error with Fork()");
else if(pid > 0) { 
    //wait here will hang the execl in the parent
    //dont wait will defunt the execl command 
    //---- wait(&pid);
    return "";
} else {
    struct rlimit       rl;
    int                 i;

    if (rl.rlim_max == RLIM_INFINITY)
        rl.rlim_max = 1024;

    for (i = 0; (unsigned) i < rl.rlim_max; i++)
        close(i);

    if(execl("/bin/bash", "/bin/bash", "-c", "whoami", (char*) 0) < 0) perror("execl()");
    exit(0); …
Run Code Online (Sandbox Code Playgroud)

c++

1
推荐指数
1
解决办法
3815
查看次数

如何在 Linux 上守护 ac/c++ 程序

我根据http://linux.die.net/man/1/daemonize上的指南在 Linux 上编写了一个守护程序,但是该进程崩溃了几次,我找不到原因。它困扰了我几天。

今天我碰巧读了 W.Richard Stevens 所著的“UNIX 网络编程第 1 卷,第三版”。在本书中,它展示了一个编写守护程序的例子。阅读示例后,我意识到我的代码中缺少“与控制终端解除关联”。

现在我的问题是守护进程,为什么我们需要与控制终端解除关联?它与进程的崩溃有关吗?我的守护进程代码中是否缺少其他任何地方?

感谢您的回复。

这是我的代码:

bool daemonize()
{
    // http://linux.die.net/man/1/daemonize

    // change working dir to root
    (void) uchdir("/");

    // close stdin, stderr, stdout
    if (int fdnull = open("/dev/null", O_RDWR))
    {   
        dup2 (fdnull, STDIN_FILENO);
        dup2 (fdnull, STDOUT_FILENO);
        dup2 (fdnull, STDERR_FILENO);
        close(fdnull);
    }   
    else
    {   
        Log (ERR, "Failed to open /dev/null");
        return false;
    }   

    // detach from previous process group
    if (setsid () == -1)      /* request a new session (job control) …
Run Code Online (Sandbox Code Playgroud)

c++ linux daemon

1
推荐指数
1
解决办法
3万
查看次数

标签 统计

linux ×6

daemon ×4

unix ×4

c++ ×3

bash ×2

fork ×2

shell ×2

c ×1

command-line ×1

ipc ×1

perl ×1

posix ×1

process ×1

python ×1

python-3.x ×1

return ×1