gpt4 book ai didi

c - linux 执行将某些内容回显到文件的 shell 脚本

转载 作者:太空狗 更新时间:2023-10-29 12:22:25 25 4
gpt4 key购买 nike

<分区>

我有一个 shell 脚本,它将执行如下内容:

文件:example.sh

#!/bin/sh
#some other code
echo "someconfig">config_file

我希望 config_file 只包含一些配置,但是 config_file 发生了奇怪的事情,它在第一行只有一个 'c'。在执行example.sh的父进程中发现没有printf('c')

我的进程将调用 linux c 函数以这种方式执行脚本:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/types.h>

int execute_shell(const char *shell)
{
pid_t pid;
int iRet = 0;
if((pid = fork()) < 0)
{
return -1;
}
else if (pid == 0)
{
execlp("sh", "sh", "-c", shell, (char*)0);
exit(127);
}
else
{
while (waitpid(pid, &iRet, 0) < 0) {
if (errno != EINTR) {
iRet = -1;
break;
}
}
}

if(WIFEXITED(iRet) == 0)
{
return -1;
}

if(WEXITSTATUS(iRet) != 0)
{
return -1;
}

return 0;
}

int main()
{
char shell_cmd[1024]="./example.sh";
if( execute_shell(shell_cmd) == -1 )
{
// handle error
}
/*other code blew,may be will write to stdout*/
return 0;
}

有时配置文件看起来很奇怪,而不是 shell 脚本回显的内容。

我用cmd分析了可能性:strace -f ./fork

[pid 12235] open("config_file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 12235] fcntl(1, F_GETFD) = 0
[pid 12235] fcntl(1, F_DUPFD, 10) = 10
[pid 12235] fcntl(1, F_GETFD) = 0
[pid 12235] fcntl(10, F_SETFD, FD_CLOEXEC) = 0
[pid 12235] dup2(3, 1) = 1
[pid 12235] close(3) = 0
[pid 12235] fstat(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid 12235] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbabb409000
[pid 12235] write(1, "someconfig\n", 11) = 11
[pid 12235] dup2(10, 1) = 1
[pid 12235] fcntl(10, F_GETFD) = 0x1 (flags FD_CLOEXEC)
[pid 12235] close(10) = 0
[pid 12235] rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
[pid 12235] read(255, "", 52) = 0
[pid 12235] exit_group(0) = ?
[pid 12235] +++ exited with 0 +++
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 12235

我不明白function=num是什么意思?如果有人分析 strace 输出的含义,我将不胜感激。

我怀疑 parent 和 child 写入标准输出,导致配置中出现奇怪的输出。

在我的项目中,我们只是使用 linux c 代码执行一个 shell 脚本,它将一些配置回显到 config_file,它正常运行 6 个月,但有一天配置看起来很奇怪(两台机器,有同样的错误,第一行是 c不是它回显的内容)。

我只是想谈谈是否有可能发生这种情况,以便有解决问题的方向。

在分析strace输出后,子进程执行一些fd操作,确保子进程和父进程回显到不同的fd。所以我认为不可能把配置弄乱。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com