【问题标题】:Process stopped if executed in background如果在后台执行,则进程停止
【发布时间】:2023-11-03 13:23:01
【问题描述】:

下面给出的代码(process1)类似于actaul scanrio。我使用 process1 的进程 ID 从另一个应用程序更新 global_data

由于进程1中的getchar(),当我运行这个进程时,

$ ./process1 &

显示以下消息。

[1]+ Stopped (tty input) ./process1

我无法删除getchar()。那么如何运行这两个应用程序。

注意:telnet/ssh 选项已尝试。如果我通过 telnet 连接,那么只有那个 telnet 窗口处于活动状态。最多我只能通过一个终端工作。

#include <stdio.h>    
volatile int global_data = 0;

int main()
{

FILE *fp = NULL;
int data = 0;    
printf("\n Address of global_data:%x \n", &global_data);

        while(1)
        {
              if(global_data == 0)
                {
                getchar();
                continue;
                }
                else if(global_data == 2)
                {
                        fp = fopen("JeyTest.txt", "w+");
                        if(fp == NULL)
                        {
                           printf("\n Error in file creation..... \n");
                                break;
                        }

                        for(data = 0; data < 1000; data++)
                        {
                            fprintf(fp, "%d\n", data);
                        }

                        fclose(fp);
                        break;
                }
        }    

return 0;
}

【问题讨论】:

  • 如果不使用共享内存,如何更改global_data
  • 使用ptrace我可以读取另一个进程的数据部分。
  • 为什么不使用共享内存呢?我会说这要容易得多(实际上是为它设计的......)
  • 我同意。但这只是一个示例。

标签: c linux ptrace


【解决方案1】:

使用您要引入流程的数据创建一个文本文件,并重定向输入:

$ ./process1 < file_with_data &

此模式避免停止进程,因为标准输入将从文件中获取。输入文件必须有足够的数据来处理请求。

【讨论】:

  • 在上面的例子中,我不知道需要多少次按键。
  • 没有上限?如果文件的数据比需要的多,则无关紧要
  • +1 用于建议来自文件的输入。但是在 process1(实际)中有更多打印的 Bcos,我没有让终端运行修改 process1 的全局数据的 process2。
  • 这仍然为我从终端获取输入。
【解决方案2】:

试图从标准输入读取的后台进程被挂起(显然)。 所以首先,弄清楚为什么你想从标准输入中读取 - 这可以避免 - 通过说命令行参数 - 如果是这样,那么你应该这样做。 在这种情况下,从您的代码来看,您似乎想等到 volatile 变量更新 - 您不想连续检查。如果是这种情况,请使用sleep

否则,您必须解决此问题

  • 从文件重定向标准输入。

【讨论】:

  • getchar() 用于在我的实际应用程序中进行交互式执行。