我正在做 :
execl("/bin/bash", "/bin/bash", NULL);
当我做一个 Ctrl+D 时,它直接退出。如何exit
在退出之前执行与 bash 相同的操作并写入?
我必须添加一个标志或其他东西execl
吗?
当我编译execl(...)
时,它打印退出Ctrl-D就好了
#include <unistd.h>
int main(int argc, char **argv)
{
execl("/bin/bash", "/bin/bash", 0);
return 0;
}
也许,您fork()
从终端执行或分离或执行其他操作,这让 bash 假设它是非交互式的。
Ctrl-D通常由终端解释。如果您想自己执行此操作,则必须VEOF
在termios
结构中重置,请参阅c_cc
详细信息。
这是一个处理Ctrl-D自己的简化示例。在处理任何内容之前它仍然会读取一整行,但你明白了
#include <sys/wait.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
int main(int argc, char **argv)
{
char buf[100];
int fd;
struct termios tio;
fd = open("/dev/tty", O_RDWR);
if (fd < 0) {
perror("open tty");
exit(1);
}
memset(&tio, 0, sizeof(tio));
tcgetattr(fd, &tio);
tio.c_cc[VEOF] = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &tio);
while (fgets(buf, sizeof(buf), stdin)) {
if (buf[0] == 4) {
printf("Got Ctrl-D\n");
break;
}
}
return 0;
}
该程序从终端读取一行,直到它接收到以 . 开头的行Ctrl-D
。
有关更多示例,请参阅串行编程 HOWTO。