【问题标题】:system() function return value from daemon always -1守护进程的 system() 函数返回值始终为 -1
【发布时间】:2014-06-06 09:49:12
【问题描述】:

我正在尝试通过 system( ) 函数。

如果注释了skeleton_daemon,则输出正确为5120(20

int main (void)
{
    skeleton_daemon();
    printf("%d", system("/tmp/prova.sh") ); // prova.sh return 20
}

void skeleton_daemon(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
    exit(EXIT_FAILURE);
if (pid > 0)
    exit(EXIT_SUCCESS);
signal(SIGCHLD, SIG_IGN);
signal(SIGHUP, SIG_IGN);
umask(0);
//    chdir("/");   // commented as per nos suggestion, nothing changed
}

有人知道如何从守护进程中获取脚本值吗?

编辑:按照 nos 的要求使用 strace -f 运行

说实话我什么都不懂

execve("./pr", ["./pr"], [/* 17 vars */]) = 0
brk(0)                                  = 0xd79000
uname({sys="Linux", node="alarm", ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f80000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=30110, ...}) = 0
mmap2(NULL, 30110, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f53000
close(3)                                = 0
open("/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\370\203\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1541182, ...}) = 0
mmap2(NULL, 1262984, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6e1e000
mprotect(0xb6f45000, 32768, PROT_NONE)  = 0
mmap2(0xb6f4d000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x127000) = 0xb6f4d000
mmap2(0xb6f50000, 9608, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f50000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f7f000
set_tls(0xb6f7f4c0, 0xb6f7fba8, 0xb6f82000, 0xb6f7f4c0, 0xb6f82000) = 0
mprotect(0xb6f4d000, 8192, PROT_READ)   = 0
mprotect(0xb6f81000, 4096, PROT_READ)   = 0
munmap(0xb6f53000, 30110)               = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb6f7f068) = 7344
exit_group(0)                           = ?
+++ exited with 0 +++

提前致谢

【问题讨论】:

  • 你的shell脚本是做什么的?您将工作目录设置为 / 这可能会影响事情,例如,如果您读/写文件。如果您使用strace -f 运行此程序,您可能会获得更多线索
  • 老实说,我已经复制/粘贴了 skeleton_daemon 函数。 shell 脚本只是简单地返回 20。我在操作中插入了 strace -f 输出。删除更改目录没有任何作用。

标签: c linux bash system return-value


【解决方案1】:

发生这种情况是因为您的skeleton_daemon() 函数忽略了SIGCHLD,但是system() 调用假定它不会被忽略,因此它可以正确地等待直到执行的程序完成。

【讨论】:

  • 你是对的!这解决了问题。我认为没有充分的理由忽略该信号...非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 2016-10-08
  • 2015-06-27
  • 2017-08-10
  • 2011-05-07
  • 1970-01-01
相关资源
最近更新 更多