c - bash、sh、ps 在 Linux 中如何工作?

标签 c linux bash sh

这是我编写的示例程序,用于了解终端中的执行工作 程序1.c

#include<stdio.h>
#include<unistd.h>
#include <stdlib.h>

int main()
{
     int i;
     printf("Checking out linux working details 2\n");
     pid_t pid=fork();
     return 0;

}

现在您能解释一下 bash、ps、sh 进程的状态(即它们的 pid 等)吗?这是示例运行

运行:

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4496  4488  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 R  1000  4506  4496  0  80   0 -  3561 -      pts/2    00:00:00 ps

$ gcc program1.c
$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4496  4488  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 R  1000  4513  4496  0  80   0 -  3561 -      pts/2    00:00:00 ps

$ ./a.out
Checking out linux working details 2

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4496  4488  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 R  1000  4516  4496  0  80   0 -  3561 -      pts/2    00:00:00 ps

$ ./a.out
Checking out linux working details 2

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4496  4488  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 R  1000  4519  4496  0  80   0 -  3561 -      pts/2    00:00:00 ps
<小时/>

程序2.c

#include<stdio.h>
#include<unistd.h>
#include <stdlib.h>

int main()
{
     system("ps -l");
     return 0;
}

示例运行:

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4592  4584  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 R  1000  4602  4592  0  80   0 -  3561 -      pts/2    00:00:00 ps

$ gcc program2.c
$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4592  4584  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 R  1000  4609  4592  0  80   0 -  3561 -      pts/2    00:00:00 ps

$ ./a.out
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4592  4584  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 S  1000  4610  4592  0  80   0 -  1055 wait   pts/2    00:00:00 a.out
0 S  1000  4611  4610  0  80   0 -  1119 wait   pts/2    00:00:00 sh
0 R  1000  4612  4611  0  80   0 -  3561 -      pts/2    00:00:00 ps

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4592  4584  0  80   0 -  6730 wait   pts/2    00:00:00 bash
0 R  1000  4613  4592  0  80   0 -  3561 -      pts/2    00:00:00 ps

ps:如果有详细的答案,我们将不胜感激

最佳答案

每次运行程序时,都会创建一个具有唯一 pid 的新进程。 这就是为什么在您的示例中 bash 的 pid 始终保持相同的原因,因为它仍然是同一进程,并且 ps 的所有连续调用都有不同的。

尽管您可以使用“ps -l”查看父 pid (ppid),它会显示创建它的进程的 pid( fork )。

也许您想尝试以下代码:

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

int main()
{
     int i;
     printf("before fork() ps -l\n");
     system("ps -l");
     pid_t pid=fork();
     if (pid < 0) {
          printf("fork-error.");
     } else if (pid == 0) {
          printf("child ps -l\n");
          system("ps -l");
     } else {
          int status;
          pid_t finished = wait(&status);
          printf("parent with child %i finished %i ps -l\n", pid, finished);
          system("ps -l");
     }
     return 0;
}

关于c - bash、sh、ps 在 Linux 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35308376/

相关文章:

c++ - 时区问题 : `$ date -R` says `+0300` , 但 `timezone` 表示 `-7200`

linux - GoDaddy cpanel 安装 : Trying to install Drush for Drupal and possibly can't find php-cli?

linux - 为什么 grep 不在此 shell 脚本中使用我的变量?

我可以从数组的某个位置重新分配吗?

c - 包含 fscanf 的程序无法编译

linux - 如何在 Linux 上使用 ant 脚本导出变量

linux - 仅解压缩特定扩展名

c - 使用 C 的指针应用程序

C 配置 API

linux - 如何仅当包含它的行不包含使用 Bash 的特定字符串时才替换文件中的字符串?