execv shell_c – 从shell调用脚本和使用system()有什么区别?

我已经构建了一个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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值