gpt4 book ai didi

c - 使用 IPC 在 while 循环内重定向 stdin

转载 作者:行者123 更新时间:2023-11-30 15:11:26 25 4
gpt4 key购买 nike

我正在尝试使用 C 将字符串写入 Linux 上的剪贴板。我计划使用 xsel -ib (从标准输入获取字符串并将其设置为当前剪贴板内容)。例如,在 bash 中,执行 echo Hello world | xsel -ib 会将“Hello World”设置到剪贴板中。

我的代码由一个简单的 IPC 组成,当我的程序(父程序)完成执行时,该 IPC 运行良好,但如果我将 IPC 包装在 while 循环内,它就不起作用。

#include<unistd.h>
void main()
{
while (1) { // 1
int pipes[2] = { 0 };
pipe(pipes);
if (fork()) {
close(pipes[0]);
write(pipes[1], "hello world", sizeof("hello world"));
} else {
close(0);
dup2(pipes[0], STDIN_FILENO);
close(pipes[1]);
execl("/usr/bin/xsel", "xsel", "-ib", NULL);
}
printf("\nTesting..");
sleep(3); // 2
} // 3
}

如果我删除“1”、“2”和“3”注释的行,它就可以正常工作。但是,有一个 while 循环对于我能够时不时地将不同的字符串输出到剪贴板来说是至关重要的。如何在不终止程序的情况下执行此操作。

最佳答案

这里有一些小更改,可以使程序更易于调试,并至少修复一些问题。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
int main() /*correct declaration is int main()...*/
{
while (1) { // 1
int pipes[2] = { 0 };
if (pipe(pipes)){
perror("pipe() failed");
exit(EXIT_FAILURE);
}
pid_t pid = fork();
if (pid == -1){
perror("fork() failed");
exit(EXIT_FAILURE);
}
if (pid) {
close(pipes[0]);
write(pipes[1], "hello world", sizeof("hello world"));
close(pipes[1]);
/*prevents file descriptor leak, also causes a read() to signal EOF rather than block indefinitely*/
int status;
wait(&status); /*prevents child zombification*/

} else {
close(0);
dup2(pipes[0], STDIN_FILENO);
close(pipes[1]);
execl("/usr/bin/xsel", "xsel", "-ib", NULL);
}
printf("\nTesting..");
sleep(3); // 2
} // 3
}

关于c - 使用 IPC 在 while 循环内重定向 stdin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651283/

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