- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个伪终端库。该代码是用 C 代码实现的,该代码由基于 Web 的终端使用。只要我不使用 sudo 或登录,代码就可以工作。
这是我在 Mac 上运行服务器时遇到的错误:
sh-3.2$ sudo ls
Password:
[1]+ Stopped(SIGTTOU)
sh-3.2$
以上适用于 Linux:
$ sudo ls
readme.txt
但是,我在 Linux 上使用 sudo bash 得到以下结果:
$ sudo bash
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
]0;root@ubuntu: /tmproot@ubuntu:/tmp#
注意:上面的工作,但我没有工作控制权。
我可能忘记在终端上设置一些控制位,但谷歌并没有帮助找到它。另外,你知道有什么好书很详细地解释了伪终端管理。
我有 setsid 调用,但我没有使用 openpty。打开 pty 时我使用以下代码:
static int createPty(lua_State* L, char* ttyName, int* pty)
{
*pty = getpt();
if (*pty < 0 || grantpt(*pty) < 0 || unlockpt(*pty) < 0)
return lDoErr(L,"Cannot open PTY: %s",strerror(errno));
if(ptsname_r(*pty, ttyName, PTY_NAME_SIZE-1))
return lDoErr(L,"ptsname_r: %s",strerror(errno));
return 0;
}
我已经编辑了下面的代码并且这段代码有效。我的第一个版本不起作用的原因是我试图创建两个 PTY channel 。我希望能够区分 stdout 和 stderr,但 Linux 内核不允许多次调用 TIOCSCTTY。
static int
childOpenTTY(const char* ttyName)
{
struct termios termbuf;
int fd=open(ttyName, O_RDWR);
if(fd < 0)
doClientError("open %s: %s",ttyName, strerror(errno));
tcsetpgrp(fd, getpid());
ioctl(fd,TIOCSCTTY,NULL);
tcgetattr(fd, &termbuf);
cfmakeraw(&termbuf); /* turn off NL to CR/NL mapping on output. */
tcsetattr(fd, TCSANOW, &termbuf);
return fd;
}
if( (ret = createPty(L, ttyName, &te->pty)) != 0)
return ret;
if ((te->pid = zzbafork()) < 0)
return lDoErr(L,"fork: %s",strerror(errno));
if(te->pid == 0)
{ /* Child process */
static const char efmt[]={"Cannot set '%s' (dup2 err)"};
int fd;
if(setsid() < 0) /* make new process group */
doClientError("setsid: %s",strerror(errno));
fd=childOpenTTY(ttyName);
if(dup2(fd, STDIN_FILENO) != STDIN_FILENO)
doClientError(efmt,"stdin");
if(dup2(fd, STDOUT_FILENO) != STDOUT_FILENO)
doClientError(efmt,"stdout");
if(dup2(fd, STDERR_FILENO) != STDERR_FILENO)
doClientError(efmt,"stderr");
if(fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO)
close(fd);
execve(cmd, (char**)cmdArgv, environ);
/* execve should not return, unless error exec cmd */
doClientError("Executing %s failed: %s",cmd,strerror(errno));
}
最佳答案
很难确定,因为此处没有显示实际代码,但我怀疑您遇到了 POSIX 样式的“ session ”管理。您需要执行 setsid
调用,然后打开 pty(从端),使其成为控制终端。 openpty
和 login_tty
例程为您完成低级垃圾工作;你在用那些吗?
关于c - 伪终端问题(Mac/Linux): SIGTTOU & Inappropriate ioctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15529761/
我有一个在 AIX 机器中运行的 Perl 脚本。 脚本尝试从某个目录打开文件,但无法读取该文件,因为文件没有读取权限,但我收到另一个错误,指出设备的 ioctl 不合适。 它不应该说类似没有文件读取
我尝试获取我想要使用的接口(interface)的 mac 地址。 我使用这段代码来这样做,但我总是收到错误消息“Inappropriate ioctl for device" 我已经尝试使用不同的套
我正在尝试添加一个具有 ar_hdr 格式的新文件成员,并将其放在存档中最后一个元素之后。我的代码可以编译,但是当我想使用 ar -t 命令查看文件名时,我收到一条错误消息: ar: hello.a:
我收到这个错误 BLKRASET: Inappropriate ioctl for device 尝试运行时 sudo blockdev --setra 256 /data 在我的 Linux 服务器
我正在尝试设置 gpg-agent 转发,以便通过 ssh 使用通行证( https://www.passwordstore.org )。 本地和远程主机上的 gpg 版本 2.2.9,按说明安装:
我只是根据guide在我的Debian 7系统上安装了Docker。当尝试通过docker -d启动Docker守护程序时,我收到以下输出: INFO[0000] +job serveapi(unix
您好,我收到此错误:ioctl:设备的 ioctl 不合适如下所示的 ioctl() 调用。 fd = open(mount, O_RDONLY); destid = ioctl(fd, TRACEF
我只想将视频转换为帧图像。 使用这个简单的代码 import cv2 vidcap = cv2.VideoCapture('gog.mp4') success,image = vidcap.read(
当我尝试在协程内建立 BT 连接时收到警告。 我检查过 this SO post ,但这只是抽象的理论创造,没有物质代码。那里的一个答案提到标题中的警告应根据具体情况进行处理,所以这是我的情况。有谁知
我在 Kotlin 中编写了这段代码,以使用 Coroutines 下载一些 API 信息来下载数据。但是,代码显示了许多警告,将消息声明为“ 不适当的阻塞方法调用 ”。 这是代码: class Do
我目前正在尝试更多地利用 kotlin 协程。但我面临一个问题:在这些协程中使用 moshi 或 okhttp 时,我收到警告: “不适当的阻塞方法调用” 解决这些问题的最佳方法是什么?我真的不想不合
我将它添加到代码中的两个位置 Flux.empty() .collectList() .block(); 在一种情况下,IntelliJ 会突出显示 .block() 并显示错误消息
这个典型的“route add default gw IP”程序给我错误: SIOCADDRT 失败:设备的 ioctl 不合适 我执行了 ifconfig 来验证接口(interface)名称。有没
我一直在尝试使用 OpenCV 从 Java 文件中读取视频。我在 Ubuntu 上运行 OpenCV 4.0.0。目前我一直在尝试这样做: VideoCapture videoCapture = n
我正在开发一个伪终端库。该代码是用 C 代码实现的,该代码由基于 Web 的终端使用。只要我不使用 sudo 或登录,代码就可以工作。 这是我在 Mac 上运行服务器时遇到的错误: sh-3.2$ s
在 OSX 上启动 hadoop 资源管理器时,出现以下错误: bash-3.2$ start-yarn.sh starting yarn daemons starting resourcemanag
perl script.pl --f1="t1" --f2="t2" --f3="t4" --f4 \$f1, 'f2=s' => \$f2, 'f3
我正在编写用作伪驱动程序的 Linux 内核模块 (LKM) - 我无法弄清楚如何在 LKM 之间进行 IOCTL 调用 (wait.c)和用户级程序 (user.c)。 设备驱动程序的魔数(Magi
【现象】 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last
在协程中调用 OkHTTP 客户端的正确方法是什么? CoroutineScope(IO).launch { val request = Request
我是一名优秀的程序员,十分优秀!