知道进程是否被 exec() 调用

Know if process has been called by exec()

有什么方法可以知道进程是从调用 exec() 开始 运行 还是由用户从终端启动?

对您有帮助:child and parent process id

getppid() returns 调用的父进程 ID 过程。这将是创建此进程的 ID 使用 fork() 的进程,或者,(!!!CARE!!!) 如果该进程已经终止,则 此进程已重新设置为父进程的进程 ID;

我也会考虑添加额外的程序参数。

所有程序都是通过调用 exec 系列函数启动的。

例如,当您在终端中键入命令时,它会搜索二进制可执行文件 forks 并在子进程中调用 exec。这会将调用进程(终端)的二进制映像替换为新程序的二进制映像。程序将执行,终端进程将 wait

paxdiablo on the question Please explain exec() function and its family 的这个绝对很棒的答案肯定会帮助您了解 exec 的工作原理。

在 Unix 中,所有进程都是使用 fork 系统调用创建的,之后可以选择使用 exec 系统调用,即使是那些由用户启动的进程(它们是 fork/exec' d 由用户的shell)。

根据你真正想做的事情,库函数 isatty() 会告诉你 stdinstdoutstderr 是否是 tty 设备的文件描述符.即输入来自终端,输出进入终端或错误进入终端。但是,像

这样的命令
 myprog < somefile 1>someotherfile 2>errorfile

将使用 isatty 来欺骗代码。但也许这就是你想要的。如果您想根据用户是从键盘输入还是从文件输入来采取不同的操作,isatty 就是您所需要的。