Выполнить команду оболочки xdotool в C ++ на linux - PullRequest
1 голос
/ 18 апреля 2020
#include <unistd.h>
#include <cstdio>
#include <iostream>
#include <string.h>

using namespace std;

int main(void)
{

//  Trying to execute:
//      xdotool mousemove 1500 1500

//    char command[] = "/usr/bin/xdotool\0";
    char command[] = "xdotool\0";
    char argument[] = "mousemove\0";
    int src_x = 1500;
    int src_y = 1500;

    char x[5];
    memset(x, 0x00, 5);
    sprintf(x, "%d", src_x);
    char y[5];
    memset(y, 0x00, 5);
    sprintf(y, "%d", src_y);

    cout << "command is " << command << "\n";
    cout << "argument is " << argument << "\n";
    cout << "x is " << x << "\n";
    cout << "y is " << y << "\n\n";

    char *args[] = {argument, x, y, nullptr};
    return execvp(command, args);
/*    char *args[] = {x, y, nullptr};
    char *com[] = {argument, nullptr};
    return execvpe(command, com, args);
    */
}

Что не так с этим кодом?
Команда выполняется, но кажется, что каждый аргумент интерпретируется как другое выполнение.
Не уверен, но я считаю, что он выполняется:

xdotool mousemove
xdotool 1500
xdotool 1500

Это вывод:

команда является аргументом xdotool
is mousemove
x - 1500
y - 1500

mousemove: неизвестная команда: 1500
Запустите 'mousemove help', если вам нужен список команд

1 Ответ

0 голосов
/ 18 апреля 2020

При сборке args вам необходимо добавить «xdotool» в качестве первого аргумента.

Из man-страницы для execvp:

Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом.

Таким образом, оно должно быть char *args[] = {"xdotool", argument, x, y, nullptr};.

...