gpt4 book ai didi

c - 为什么我在设置其他组ID后不调用 "read"?

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:22 24 4
gpt4 key购买 nike

在这个程序中,我更改了子进程的组 ID。

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

int main(void) {
int status;
char b[4];
pid_t pid, ch_pid;

switch(pid=fork()) {
case -1:
perror("Fork failed");
exit(1);
case 0:
printf("\nCHILD: This is child process!\n");
printf("CHILD: My PID is-- %d\n", getpid());
printf("CHILD: My parent PID -- %d\n", getppid());
printf("CHILD: My GID is -- %d\n", getpgid(getpid()));
printf("CHILD: My SID is -- %d\n", getsid(getpid()));
int k = setpgid(getpid(),getpid()); /*Modifies group id. Therefore, when user press
Cn+C, ChPr can't die*/
printf("BEFORE SETPGRP CHILD: My GID is -- %d\n", getpgid(getpid()));
printf("BEFORE SETPGRP CHILD: My SID is -- %d\n", getsid(getpid()));
//read(0,b,4);
//printf("b: %s\n",b);
pause();
exit(0);
default:
printf("PARENT: This is parent process!\n");
printf("PARENT: My PID -- %d\n", getpid());
printf("PARENT: My child PID %d\n",pid);
printf("PARENT: My parent PID %d\n",getppid());
printf("PARENT: My GID %d\n",getpgid(getpid()));
printf("PARENT: My SID %d\n",getsid(getpid()));
pause();
exit(0);
}
return 0;
}

但是当我尝试调用“read”(注释字符串)时,bash 终端不读取也不输出。但是,父进程正在读取成功。为什么?父进程和子进程具有相似的 session ID。这意味着它们由公共(public) tty 控制。我注意到,如果我更改子进程的 GID 并按 Cntrl+C,父进程只会中断,子进程会变成孤儿。所以,如果我在我的程序中取消注释“读取”并按 Cntrl+C,它会杀死两个进程。可能不成功的读取调用向 bash 发送了一些信号?谢谢!

最佳答案

终端有一个前台进程组设置。当 shell 运行命令时,它在终端的前台进程组中运行前台作业,而后台作业则放在自己的进程组中。只允许前台进程组从终端读取。如果后台进程试图读取,它会被挂起;当用户将其移动到前台时,终端进程组更改为该组,进程恢复,然后就可以读取了。有一个stty模式tostop可以用来控制后台进程是否可以写终端,但是读没有类似的选项,总是禁止的。

如果您希望进程在更改其进程组后能够从终端读取,则需要更改终端的前台进程组。这是使用 tcsetpgrp() 完成的功能。

tcsetpgrp(0, getpgid(getpid()));

关于c - 为什么我在设置其他组ID后不调用 "read"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998925/

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