我已经构建了一个bash脚本来启动系统中的某些进程.它只是调用进程和相关的配置文件.我从命令行调用的相同.
#!/bin/bash
# Start specified process in a new session
setsid $1 &>/dev/null &
所以要启动某个进程,我会从命令行调用:
root@supercomputer:~# start someprocess
这就像一个魅力.每一个过程,每一次.但是当我从另一个正在运行的C进程进行系统调用时,某些进程永远不会启动.
system( "start someprocess" )
对于我的90%的流程,这种方法除了一个.工作和非工作流程的唯一区别是非工作流程使用下面的专有库.我最近在bash脚本中添加了setsid选项,希望开始一个新的会话会有所帮助,但它没有任何区别.我也试过popen和execv.没变.
所以我的问题是用system()调用某些东西和从命令行调用同一个调用之间的区别是什么?
所有进程都在Linux上用C语言编写.
解决方法:
仅当bash作为交互式非登录shell运行时,才会调用.bashrc.如果它作为非交互式shell调用,就像在带有bash shebang的脚本上使用system()时,它只读取$BASH_ENV指向的配置文件.
这意味着您有以下选择:
>将-l添加到shebang – 使shell在启动时读取〜/ .profile
>在调用system()之前将$BASH_ENV设置为您想要获取的脚本
>将-i添加到shebang – 将bash作为交互式shell调用并使其读取〜/ .bashrc,但也会影响bash处理输入/输出的方式.
我推荐第一个选项.
你可以找到bash如何读取它的启动文件here的详细解释.我不确定这会完全解决你的问题,但它可能会解决这个问题的一部分.
标签:c-2,linux,process,parent-child
来源: https://codeday.me/bug/20190625/1283409.html