Comment puis-je transmettre des arguments de ligne de commande au processus en cours?

Dans la plate-forme Linux, si j’écris dans la console ps -p "pid" -o command j’obtiens la ligne complète avec tous les arguments transmis au terminal lorsque je lance le programme. Affiche dans la console quelque chose comme ceci: COMMAND gedit /home/sasha/Work/unloker/main.cpp (Ubuntu) . Maintenant, j’écris le programme dont le but principal est d’obtenir une ligne de commande complète du processus de saisie. Mon code C ++ est:

 snprintf(path_cmdline, sizeof(path_cmdline), "/proc/%d/cmdline", pid); fd_cmdline = open(path_cmdline, O_RDONLY); if (fd_cmdline < 0) { } else { char process_name[PATH_MAX]; if (read(fd_cmdline, process_name, PATH_MAX) < 0) { } else { pid_info pid_t; pid_t.pid=pid; strcpy(pid_t.command_line,process_name); strcpy(pid_t.process_name,basename(process_name)); std::cout << pid_t << std::endl; } } 

et la sortie de mon programme quelque chose comme ça: 10753 gedit gedit , mais comment puis-je obtenir la ligne de commande complète comme lorsque la sortie de la commande ps -p "pid" -o command ?

Où dans la ligne de commande /proc/%d/ gardée complète du programme en cours d’exécution? Dans le système Solaris, je sais qu’il existe des commandes qui font ce que je veux, peut-être comment maintenant je peux trouver des sources de cette commande?

Les arguments dans / proc / pid / cmdline sont une liste de chaînes séparées par 0 octet. Par conséquent, le traiter comme une chaîne C, qui se termine par le premier octet, ne vous donnera que le nom du processus. Remplacez tous les 0 octets jusqu’à la taille renvoyée par read avec des espaces et réessayez.

Voici la preuve:

 $ hexdump -bc < /proc/32096/cmdline 0000000 142 141 163 150 000 055 162 143 146 151 154 145 000 056 142 141 0000000 bash \0 - rcfile \0 . ba 0000010 163 150 162 143 000 0000010 shrc \0 0000015 

dans linux, les informations sur le processus en cours d’exécution sont stockées dans le dossier / proc / –
/ proc / {PROCESS_ID} / cmdline pour être exact – par exemple ici chrome-

  $cat /proc/3193/cmdline /opt/google/chrome/chrome --type=renderer --lang=en-US --force-fieldsortingals=ConnCountImpact/conn_count_6/ConnnectBackupJobs/ConnectBackupJobsEnabled/DnsImpact/default_enabled_prefetch/GlobalSdch/global_enable_sdch/IdleSktToImpact/idle_timeout_10/OmniboxDisallowInlineHQP/Standard/OmniboxSearchSuggest/6/Prerender/ContentPrefetchPrerender1/ProxyConnectionImpact/proxy_connections_32/SBInterstitial/V2/SpdyImpact/spdy3/UMA-Dynamic-Binary-Uniformity-Trial/default/UMA-Uniformity-Trial-1-Percent/group_31/UMA-Uniformity-Trial-10-Percent/group_05/UMA-Uniformity-Trial-20-Percent/default/UMA-Uniformity-Trial-5-Percent/group_13/UMA-Uniformity-Trial-50-Percent/group_01/WarmSocketImpact/warmest_socket/ --enable-crash-reporter=81A0480CAE65B69A53CE6E791EAA05A5,Ubuntu 10.10 --disable-client-side-phishing-detection --renderer-print-preview --disable-accelerated-2d-canvas --channel=2980.13.513987986