Вот минимальный пример изменения дескрипторов файлов порожденного процесса, сохраненный как foo.c
:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <spawn.h>
int main(int argc, char* argv[], char *env[])
{
int ret;
pid_t child_pid;
posix_spawn_file_actions_t child_fd_actions;
if (ret = posix_spawn_file_actions_init (&child_fd_actions))
perror ("posix_spawn_file_actions_init"), exit(ret);
if (ret = posix_spawn_file_actions_addopen (&child_fd_actions, 1, "/tmp/foo-log",
O_WRONLY | O_CREAT | O_TRUNC, 0644))
perror ("posix_spawn_file_actions_addopen"), exit(ret);
if (ret = posix_spawn_file_actions_adddup2 (&child_fd_actions, 1, 2))
perror ("posix_spawn_file_actions_adddup2"), exit(ret);
if (ret = posix_spawnp (&child_pid, "date", &child_fd_actions, NULL, argv, env))
perror ("posix_spawn"), exit(ret);
}
Что это делает?
posix_spwan
является указатель типа posix_spawn_file_actions_t
(который вы указали как NULL
). posix_spawn
будет открывать, закрывать или дублировать дескрипторы файлов, унаследованные от вызывающего процесса, как указано объектом posix_spawn_file_actions_t
. posix_spawn_file_actions_t
(chiild_fd_actions
) и инициализируем его с помощью posix_spawn_file_actions_init()
. posix_spawn_file_actions_{addopen,addclose,addup2}
могут быть использованы для открытия, закрытия или дублирования дескрипторов файлов (после функций open(3)
, close(3)
и dup2(3)
) соответственно. posix_spawn_file_actions_addopen
файл по адресу /tmp/foo-log
в дескриптор файла 1
(он же stdout). posix_spawn_file_actions_adddup2
fd 2
(он же stderr
) на fd 1. child_fd_actions
, чтобы отметить, что эти действия должны быть предприняты. posix_spawn
с объектом child_fd_actions
. Тестируем:
$ make foo
cc foo.c -o foo
$ ./foo
$ cat /tmp/foo-log
Sun Jan 3 03:48:17 IST 2016
$ ./foo +'%F %R'
$ cat /tmp/foo-log
2016-01-03 03:48
$ ./foo -d 'foo'
$ cat /tmp/foo-log
./foo: invalid date ‘foo’
Как видите, и stdout, и stderr порожденного процесса отправились в /tmp/foo-log
.
Согласно Menu > Preference > Colour
, влияет ли изменение цветового профиля на изображения, просматриваемые в средстве просмотра изображений?
Вы можете попробовать опубликовать результаты sudo inxi -Fxzd
, чтобы предоставить нам более подробную информацию о вашей среде.
Я также рекомендую проверить, установлена ли у вас конфигурация Xorg в /etc/X11/xorg.conf
.
Если это так, проверьте и убедитесь, что параметр Gamma
не настроен.
Хотя я сомневаюсь, что это поможет, так как Пикс показывает их хорошо...