Так что это должно делать разветвление, дочерний процесс получает текст файла, а затем родительский процесс изменяет этот текст и записывает его в новый файл. У меня разные странности исходят от этого. Весь код примерно такой.
#include <iostream>
#include <termios.h>
#include <cstdio>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/wait.h>
using namespace std;
int parentPID;
int main(int argc, char* argv[]){
parentPID = getpid();
int pipey[2];
int worked = pipe(pipey);
if( worked == - 1){
cout << "Oops. Didn't make a pipe.";
}
//cout << "About to fork!!!";
fork();
if(getpid() != parentPID){//Only run in the child process
char* argvec1[3] = {"cat", "colorfile.txt", (char*)0};
dup2(pipey[1], 1);
execv("/bin/cat", argvec1);
}
else{//Only run in the parent process.
int someInt;
cout << "In the parent process";
pid_t status = wait(&someInt);
dup2(pipey[0], 0);
creat("newfile.txt", 0777);
chmod("newfile.txt", 0777);
int targetFile = open("newfile.txt", O_WRONLY);
if(targetFile == -1){
cout << "\nOops, couldn't open targetFile, ";
perror("because ");
}
else{
cout << "\nOpened target file.";
}
dup2(targetFile, 1);
//char* argvec2[] = {"sed", "-e", "s/color/colour/g", (char*)0};
//execv("/bin/sed", argvec2);
cout << "something went terribly wrong";
}
}
Особую тревогу вызывают три вещи, во-первых, этот фрагмент кода...
creat("newfile.txt", 0777);
chmod("newfile.txt", 0777);
int targetFile = open("newfile.txt", O_WRONLY);
if(targetFile == -1){
cout << "\nOops, couldn't open targetFile, ";
perror("because ");
}
else{
cout << "\nOpened target file.";
}
dup2(targetFile, 1);
... не записывает «Открытый целевой файл» в стандартный вывод. Вместо этого он помещает его в newfile.txt, поэтому dup2 меняет вывод команд вывода, которые появляются перед ним?... если я закомментирую dup2 в конце, этого не происходит, это определенно конкретный dup2 позвоните, чтобы это произошло.
во-вторых, этот фрагмент кода...
creat("newfile.txt", 0777);
chmod("newfile.txt", 0777);
int targetFile = open("newfile.txt", O_WRONLY);
if(targetFile == -1){
cout << "\nOops, couldn't open targetFile, ";
perror("because ");
}
else{
cout << "\nOpened target file.";
}
//dup2(targetFile, 1);
char* argvec2[] = {"sed", "-e", "s/color/colour/g", (char*)0};
execv("/bin/sed", argvec2);
cout << "something went terribly wrong";
... вообще не выводит никакого успеха/неудачи в отношении открытия файла. Он распечатывает содержимое исходного файла, соответствующим образом измененного, но затем не завершается. Это просто сидит вечно, пока я не использую Ctrl-C, чтобы убить текущий процесс. Окончательный cout не отображается.
Наконец, это...
creat("newfile.txt", 0777);
chmod("newfile.txt", 0777);
int targetFile = open("newfile.txt", O_WRONLY);
if(targetFile == -1){
cout << "\nOops, couldn't open targetFile, ";
perror("because ");
}
else{
cout << "\nOpened target file.";
}
dup2(targetFile, 1);
char* argvec2[] = {"sed", "-e", "s/color/colour/g", (char*)0};
execv("/bin/sed", argvec2);
cout << "something went terribly wrong";
... не дает мне никакого вывода ни в стандартный вывод, ни в newfile.txt.
Создается впечатление, что некоторые из этих системных вызовов просто выполняются в том порядке, в каком им хочется, полунезависимо от порядка, в котором я их написал, что делает практически невозможным что-либо с ними сделать.
<< endl
для принудительного вывода, но в большинстве случаев достаточно простого"\n"
в конце. Кроме того, поскольку вы не создаете исполняемые программы, x-биты в разрешении 0777 неуместны — 0666 или даже 0644 были бы более разумными. - person Jonathan Leffler   schedule 06.03.2014